leetcode之Middle of the Linked List(876)

题目:

给定一个带有头结点 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 之间。

分析:

设置快慢指针,一开始快慢指针都指向head,然后只要快指针还没有走到头,那么快指针每次走两步,慢指针每次走一步,当快指针走到头的时候,慢指针刚好走了一半,正好符合题意。如果此题要找链表开头的1/3处,也可以用快慢指针去做,此时快指针一次走3步,慢指针一次走1步。

python代码:

class Solution(object):
    def middleNode(self, head):
        slow = fast = head
        while fast != None and fast.next != None:
            fast = fast.next.next
            slow = slow.next
        return slow

心得:在链表里,有快慢指针的思想会使好多问题变得很简单。

猜你喜欢

转载自blog.csdn.net/cuicheng01/article/details/81390957