LeetCode 876——链表的中间结点

1. 题目

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:[1,2,3,4,5]

输出:此列表中的结点 3 (序列化形式:[3,4,5])

返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。

注意,我们返回了一个 ListNode 类型的对象 ans,这样:

ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:

输入:[1,2,3,4,5,6]

输出:此列表中的结点 4 (序列化形式:[4,5,6])

由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

提示:

给定链表的结点数介于 1 和 100 之间。

2. 思路

定义快慢两个指针,从头结点开始,慢指针每次向后移动一个结点,快指针每次向后移动两个结点。

  • 若链表有奇数个结点,当快指针指向最后一个结点时,慢指针即指向链表的中间结点

  • 若链表有偶数个结点,当快指针指向 NULL 时,慢指针即指向链表的中间结点
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* middleNode(ListNode* head) {

        ListNode* slow = head;  // 慢指针指向头结点
        ListNode* fast = head;  // 快指针指向头结点

        // 奇数结点快指针指向最后一个结点结束
        // 偶数结点快指针指向 NULL 结束
        while(fast && fast->next)
        {
            slow = slow->next; //慢指针前进一步
            fast = fast->next->next; //快指针前进两步
        }

        return slow;    // 返回中间结点

    }
};

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/9784332.html

时间: 2024-08-29 23:43:55

LeetCode 876——链表的中间结点的相关文章

leetcode——876. 链表的中间结点

# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def middleNode(self, head: ListNode) -> ListNode: if head.next==None: return head r=[] while head: r.append(head.val) he

Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)

??本次部分没有带题目,因为链表系列的题目有的非常直观,从名字中就能知道到底需要做什么. 21. 合并两个有序链表 """ (用中间链表的方法)可以想象为双指针,分别指向两个链表,比较指针当前指向的值(因为是比较当前的值所以不需要判断next是否为空),拥有较小值的链表指针后移. """ class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNo

Leetcode daily 20/03/23 链表的中间结点

链表的中间结点 -题目- 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. -示例1- 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 . (测评系统对该结点序列化表述是 [3,4,5]). 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans

找链表的中间结点

//找链表的中间结点 /* 已知单链表L,编写算法找出该链表的中间位置的结点. 思考: 1.一种想法就是从头遍历到尾部,记录长度.随后再次遍历一次,直到长度的二分之一即找到.时间复杂度为O(3n/2) 2.另一种想法:设置快慢指针,快指针一次走两步,慢指针一次走一步,当快指针走到NULL的时候,慢指针的位置就是链表的中间位置 本程序使用第二种想法 */ #include <iostream> #include <string> using namespace std; int L_

[LeetCode系列]链表环探测问题II

给定一个链表头, 探测其是否有环, 如果没有返回NULL, 如果有返回环开始的位置. 环开始的位置定义为被两个指针指向的位置. 算法描述: 1. 快慢指针遍历, 如果到头说明无环返回NULL, 如果相遇说明有环, 进入2. 2. 慢指针回到起点, 快慢指针每次移动一格直到相遇, 返回快指针/慢指针. 代码: 1 class Solution { 2 public: 3 ListNode *detectCycle(ListNode *head) { 4 if (!head || !head->ne

【算法题 14 LeetCode 147 链表的插入排序】

算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def insertionSortList(self, head): """ :type head: ListNode

快速找到未知长度的单链表的中间结点

问题描述:快速找到未知长度的单链表的中间结点 普通方法:首先遍历一遍单链表,以确定单链表的长度L,然后再从头结点出发,循环L/2次,找到单链表的中间结点. 高效算法(快慢指针):设置两个指针,*search,*mid都指向单链表的头结点.其中*search指针的移动速度是*mid指针移动速度的2倍.当*search移动到链表末尾时,*mid刚好在中间结点.(标尺的思想) //快速得到单链表的中间结点 Status GetMidNode(LinkList &L,int &e){ LinkLi

LeetCode 单链表专题 (一)

目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Partition List \([82]\) Remove Duplicates from Sorted List II \([61]\) Rotate List \([19]\) Remove Nth Node From End of List LeetCode 单链表专题 <c++> \([2]\)

LeetCode 206 链表 Reverse Linked List

LeetCode 206 链表 Reverse Linked List Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL Follow up: A linked list can be reversed either iteratively or recursively. Could you implement