版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/83866910
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
**说明:**不允许修改给定的链表。
进阶:
你是否可以不用额外空间解决此题?
解题思路
这是之前问题Leetcode 141:环形链表(最详细的解法!!!)的提高,我们还是采用快慢指针来做。
我们建立两个指针,一个slow
一个fast
,我们令移动速度关系为
,我们假设环的长度为
的倍数k
,如果此时slow
和fast
都在环内的话,那么在一定时间内两者必定可以相遇(使用相对速度很好理解)。如果此时slow
的起点是在环的初始点(例如前面例子中的3
),那么fast
和slow
最后一定会在起点相遇(因为
一定为0
,其中后面的
为相对速度)。我们现在的问题就变成了如何判断slow
在环的初始点,这也非常简单,我们再简历一个entry
指针,当slow==fast
的时候,我们判断slow==entry
,如果是的话,那么entry
即为环的初始点,否则的话我们将entry++;slow++;
,判断下一个位置是不是环的起始点。
class Solution:
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None:
return None
fast, slow, entry = head, head, head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
while slow != entry:
slow = slow.next
entry = entry.next
return entry
return None
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!