🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
首先,我们先来看一下这段代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head)
{
if(head==NULL||head->next==NULL)
{
return false;
}
//快慢指针
struct ListNode* slow=head;
struct ListNode* fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
我们这里用到的方法是快慢指针法 ,我们设定一个快指针一个慢指针,快指针每次前进两步,而慢指针每次前进一步。如果真的有环,那么后面就会成为追击相遇问题,而且,由于有速度差,且为1,所以可以追上,所以当快指针追上慢指针的时候,就有环。
那么,其实这里有一个很重要的问题,如果,当快指针每次前进三步,或者当快慢指针之间的速度差大于1的时候,二者还可以追上吗?
我们假设当slow进环的时候,与fast之间的距离差是N,而slow和fast之间的速度差是2,环的长度是C,
那么二者之间的距离就是N,如果N是奇数的话,那么就会错过,并且接下来的长度是C-1,如果C-1又为奇数的话,那么二者永远不会相遇。
如果N是偶数的话,那么二者就会在环的某一点进行相遇。
所以,我们这里会存在一种特殊情况,那就是N为奇数,并且C-1为奇数,这种情况存在吗?
S(fast)=3S(slow),所以,C-N为两倍的slow的路程,则不可能为奇数,如果C-1为奇数,N为奇数,那么C为奇数,此时,N为偶数,恰好矛盾,所以,这种情况是不存在的。
,所以,这种情况可以不用考虑。