腾讯25-环形链表 II leetcode142
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
这道题就是求环形链表的入口。
这张中,快慢结点第一次在z点处相遇,
则慢结点走过a+b,快结点走过a+b+c+b
因为能相遇,则快结点走过的距离必然是慢结点的两倍,(必然是整数倍,第一次就是2倍)。
则2(a+b)=a+b+c+b,得出a=c,而我们要求的就是a,
于是我们让慢结点回到起点head,同时快结点在z点速度变慢成一倍速,这样,快慢结点同样各自走a和c的路程,而a=c,会在Y点相遇。即为所求。
# 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:
if head is None or head.next is None :
return None
else:
fast,slow=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