题目:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回null。
思路:
(1)假设链表有a+b个结点(从head到链表环入口共a个结点,链表环共b个结点);
(2)设快、慢指针分别走了f、s
步,那么会有以下两个结论:f=2*s
f=s+n*>b
<----快指针多走了n个环的长度;
(3)由(2)可得,s=n*b
;
(4)再假设,我们从head指针开始,一直走到环的入口,共走了k步,那么k=a+n*b
,此时由于慢指针slow已经走了n*b
步(s=n*b
),因此其只需要再走a步即可;
(5)因此,再构建一个指针,指向head,与slow一起向前走,二者相遇的地点,即为环的入口。
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
fast, slow = head, head
isCycle = False
while fast is not None and fast.next is not None:
fast = fast.next.next
slow = slow.next
# 找到重合的位置
if fast == slow:
isCycle = True
break
if not isCycle:
return None
fast = head
while fast != slow:
fast = fast.next
slow = slow.next
return fast