js一刷 哈希表
javascript
var detectCycle = function(head) {
let idx=new Map();
let p1=head;
while(p1){
if(idx.has(p1)) return p1;
idx.set(p1,1);
p1=p1.next;
}
return null;
}
js 一刷 快慢指针
javascript
//我们的任务是找到入环点
var detectCycle = function(head) {
let slow=head,fast=head;
while(fast&&fast.next){
fast=fast.next.next;
slow=slow.next;
if(fast===slow){
let p1=head;
while(p1!=slow){
p1=p1.next;
slow=slow.next;
}
return p1;
}
}
return null;
}
算法核心:找到入环结点 并返回

假设进环前的路程为 a,环长为 c。设慢指针走了 b 步时,快慢指针相遇,此时快指针走了 2b步。显然 2b-b=nc(快指针比慢指针多走了 n 圈),即 b=nc。也就是说慢指针总共走过的路程是 nc,但这 nc 当中,实际上包含了进环前的一个小 a,因此慢指针在环中只走了 nc-a 步,它还得再往前走 a 步,才是完整的 n 圈。所以,我们让头节点和慢指针同时往前走,当他俩相遇时,就走过了最后这 a 步。