环形链表 II
这题出的很有意思,不错不错
对环的指针判定和同余关系的利用很有意思。
- 相遇方程
a + b + n ∗ ( b + c ) ≡ ( a + b ) m o d ( b + c ) a+b+n*(b+c) \equiv (a+b) \mod(b+c) a+b+n∗(b+c)≡(a+b)mod(b+c) - 距离方程
a + b + n ∗ ( b + c ) = 2 ∗ ( a + b ) a+b+n*(b+c) =2*(a+b) a+b+n∗(b+c)=2∗(a+b)
得出: a = c + ( n − 1 ) ∗ ( b + c ) a=c+(n-1)*(b+c) a=c+(n−1)∗(b+c)
即: a ≡ c m o d ( b + c ) a\equiv c \mod(b+c) a≡cmod(b+c)
(图片来自力扣)
/**
* 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) {
ListNode *slow = head, *fast = head;
while(fast){
slow = slow->next;
if(fast->next==nullptr) return nullptr;
fast = fast->next->next;
// 先移动,后判断,是防止初始时刻的相等
if(slow==fast){
ListNode *cur = head;
while(cur != slow){
cur = cur->next;
slow = slow->next;
}
return cur;
}
}
return nullptr;
}
};