题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/
难度:中等
描述:
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
提示:
链表节点数:[0, 10000]
题解
思路:
维护两个指针fast
和slow
,slow
每次走一步,fast
每次走两步。
若链表中没有环,那么fast
最终会等于None
。
若链表中有环,那么slow
和fast
必定会相遇。这时设slow
走过的步数为x
,那么fast
走过的步数就为2x
。设链表头节点到环的入口的步数为a
,环的长度为b
,slow
比fast
多走n
个环,即2x - x = nb
,即x = nb
。这时,只要fast
或slow
再走a
步就又到了环的入口,所以我们可以将fast
移动到head
处,让它每次走一步,slow
也同时行动。那么fast
走a
步到了环的入口时,slow
也走了a
步到了环的入口,它们相遇,就可以找的环的入口了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow, fast = head, head
while fast is not None and fast.next is not None:
fast = fast.next.next
slow = slow.next
if fast == slow:
slow = head
while fast != slow:
fast = fast.next
slow = slow.next
return slow
return None