需要注意:环形链表不是循环链表,但循环链表是一种环形链表。(百度和字节喜欢考)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode* slow=head,*fast=head;
while(fast && fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(slow=fast)
return true;
}
return false;
}
相遇问题:需要用到快慢指针
结论:
1.slow一次走一步,fast一次走两步,一定能追得上:
假设slow进环,fast开始追,假设slow与fast的距离为N,追的过程中,他们之间的距离变化:
N;
N-1;
N-2
...
1
0(相遇)
故fast追slow时,每走一步,距离缩小1,距离是0时,他们相遇。
2.slow一次走一步,fast一次走3步,可能不能相遇:
先假设进环后,slow与fast的距离相差N,slow走一步,fast走三步,距离相差N-2
N
N-2
N-4
....
0/-1
N偶数时0(fast与slow相遇)/, N为奇数时-1(fast超过slow1步,错过,则进入新的追逐,他们之间的距离是C-1,C是环的长度).
如果C-1是偶数,就能追得上,如果C-1是奇数,就永远追不上。(距离是奇数时,快追上时,结果为-1,则fast反超slow)