题目:
给定一个带有头结点 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
心得:在链表里,有快慢指针的思想会使好多问题变得很简单。