LeetCode 142. 环形链表 II (快慢指针、同余)

环形链表 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+(n1)(b+c)
即: a ≡ c m o d    ( b + c ) a\equiv c \mod(b+c) acmod(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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108997251