leetcode原题142. 环形链表 II - 力扣(Leetcode)(附C++代码截图)
图解如下:

让一对快慢指针(Fast每次移动两步,Slow每次移动1步)从H点开始向后移动;
Slow第一次走到E点,走了L长度,Fast走了2L长度(Fast位置暂时不确定);
Slow第一次走到M点共走了L+X长度,Fast共走了2(X+L)长度,二者交会在M点,此时Fast可能在环内转 了n圈+ X长度,共走了L+nR+X长度,从圈数看Fast比Slow多走了n圈,此时L+nR+X=2(X+L),计算得L+X=nR,L=nR-X
此时将Fast放在H点(head处),Slow在M处,二者每次移动皆变为1步,Fast移动L长度至E点时Slow移动L=nR-X长度,n=1,2,3...(取决于圈的大小),若n=1,则L=R-X,二者在E处相遇,若n=2,则L=R+R-X,Slow在转了一圈后回到M点后又走了R-X长度,二者在E处相遇,以此类推,不论n是多少,二者都会在E处相遇,无非是早晚的区别。
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast=head;
ListNode* slow=head;
ListNode* enter=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(fast==slow){
while(slow!=enter){
slow=slow->next;
enter=enter->next;
}
return enter;
}
}
return NULL;
}
};
