思路:
利用快慢指针,如果快每次走两个,慢指针每次走一个,则最终必然会相遇。
证明:
先猜想:是否快会跟慢永不相遇,在环内可能跨过慢
存在环时,快先入环,慢后入环,假设慢入环时,两者相差N,快慢指针两者每走一次,相差1,所以两者的差距N会有消为0的时候。
bool hasCycle(struct ListNode *head) {
struct ListNode* fast = head;
struct ListNode* slow = head;
// 要做fast->next遍历,但是只写while f->next必然会出错 因f会有不存在情况
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
{
return true;
}
}
return false;
}
假设慢指针是s,快指针是f
- 设进入环后差为N,s、f每走一次,两者差距变为N-2,N-4,N-6,如果N是偶数,那么会有为0的情况,如果N是奇数,就不会相遇。因为差距会从1到-1、-3。。。
设进入环后差为N,s、f每走一次,两者差距变为N-3,N-5,N-7,所以也不一定相遇。N为3的倍数,可能会相遇。
由2我们已经能推出来了,如果两者入环后的差距N是两者速度差n-1的倍数,那么就会相遇。
仍然是:若 ** N % (m-n) == 0:则必定相遇 **,其它情况,可能相遇也可能不想与