https://leetcode-cn.com/problems/linked-list-cycle-lcci/solution/huan-lu-jian-ce-by-leetcode-solution-s2la/
法1:hash
法二 快慢指针:
一个快指针f 每次走两步
一个慢指针l 每次走一步
当他们第一次相遇的时候,快指针与慢指针都过了a,
并且快的比慢的多走了n个b,n是整数
由于
因为两者速度差值和l的速度是一样的
重点是,此时l也走了n个b的长度,虽然可能不在环的入口
这个时候需要把l走到环的入口
就让l再走a即可
所以让一个指针在head的地方和l一起走
然后相遇的时候就是入口了
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
bool cy = false;
auto f = head;
auto l = head;
while(f!=nullptr && f->next!=nullptr){
f = f->next->next;
l = l->next;
if(f == l){
cy = true;
break;
}
}
if(!cy){
return nullptr;
}
f = head;
while(true){
if(f == l){
break;
}
f = f->next;
l = l->next;
}
return l;
}
};