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;
}
};
文章介绍了如何解决LeetCode的142题——环形链表II,通过使用快慢指针法寻找链表中的环。当快指针首次与慢指针相遇时,确定环的入口,并通过重新设置快慢指针来找到环的长度,最终确定环的位置。代码示例使用了C++编写。

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



