题目:
给定一个链表的头节点 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
链表环形入口检测算法

该博客详细介绍了如何通过快慢指针法找出链表中的环形入口节点。首先,设定快慢指针,快指针每次移动两步,慢指针移动一步。当快指针追上慢指针时,说明存在环。然后,再设置一个指针从头节点开始,与慢指针同步移动,最终二者相遇点即为环的入口。
633

被折叠的 条评论
为什么被折叠?



