LeetCode | 141. 环形链表
思路:
这里我们可以使用快慢指针来解决问题
- slow一次走两步
- fast一次走一步
- 当slow和fast相遇的时候就说明带环,否则就是否
代码如下:
bool hasCycle(struct ListNode *head) { struct ListNode*slow = head,*fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(fast == slow) return true; } return false; }
那么有几个问题
- slow一次走1步,fast一次走两步,一定会相遇吗?
- slow进环后,fast和slow的距离变化,每次追击距离缩小1,距离为0的时候就追上了~~
- slow一次走1步,fast一次走三步,一定会相遇吗?
- 如果N是偶数直接就追上了
- 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
- 如果N是奇数,C是偶数,就永远追不上~~
- 这里反转来了,那么N是奇数,C是偶数时就追不上,这个条件是否成立?请证明!
- 结果是条件不成立~~
证明:
- 如果N是偶数直接就追上了
- 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
- 如果N是奇数,C是偶数,就永远追不上
- 2L = n * C -N
- 偶数 = n * 偶数 - 奇数 ---->永远追不上的条件是不成立的
- slow一次走n步,fast一次走m步,一定会相遇吗?
m>n>1
- 这个问题和上一个问题很相似
- 距离缩小m-n(>=1的整数)N%(M-N) == 0