1.141
https://www.acwing.com/video/1513/
快慢指针:快指针往前走探路,当探勘到null时,说明肯定不是环状链表;
如果成环,快慢指针必须相遇在一起。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head || !head->next) return false;
auto s=head,f=head->next;
while(f)
{
s=s->next,f=f->next;
if(!f) return false;
f=f->next;
if(s==f) return true;
}
return false;
}
};
2.142
分析的时候快慢指针是同时从起点走,慢指针走x步到入口点b,快指针走了2x步到c’,代码里快指针起始点不是和慢指针从同一点出发,这样慢指针走了x步,快指针走了2x+1步,这样再从c点走x步不能在环入口点相遇,循环也退不出来
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(!head || !head->next) return NULL;//链表没有元素或者只有一个元素,null
auto s=head,f=head->next;//这里注意快指针比慢指针多走了一步,后续也要注意
while(f)
{
s=s->next,f=f->next;
if(!f) return NULL;
f=f->next;
if(s==f)
{
s=head,f=f->next;//这里注意慢指针回到head时,快指针如果不走一步的话,两者步调就不同了。
while(s!=f) s=s->next,f=f->next;
return s;
}
}
return NULL;
}
};