问题描述:
Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull
.
Follow up:
Can you solve it without using extra space?
这里问题的关键是求环开始的地方。我们先来画一个图:
链表的方向是:X-》Y-》Z
现在我们分别设一个指向这个链表的两个指针,一个快指针F一个慢指针S,遍历链表,其中快指针是慢指针的两倍(s=s->next->next).
我们设Z+Y=C。
我们假设在m点相遇,那么我们可以得到:
快指针所走路程为:pC+Y+X
慢指针所走路程为:qC+X+Y
其中pq分别为快慢指针相遇前所走圈数。
我们有:
pC+Y+X=2(qC+X+Y)
因此我们有:
X+Y=pC-2qC
这里我们可以看到X+Y是圈的整数倍。
由于Y=C-Z
所以X=pC-2qC-C+Z。
如果我们在相遇时S从相遇的位置开始fF从head开始都以慢速开始走那么他们会在圈的开始处相遇。