题目

力扣题目

考察内容

解题思路

代码演示

C++
struct ListNode {
    int val;
    ListNode* next;

    ListNode(int x)
        : val(x),
          next(NULL) {}
};

ListNode* detectCycle(ListNode* head) {
    // 如果环存在 当 slow 到达环的起点时, fast 肯定在环中某个位置,而且至少在环中走了一整圈
    // 环中走 1 圈和 n 圈到达的位置和是一样的,所以走多少圈效果不变,L 为圈长,则 nL == L
    // 那么第一次相遇 fast 在环里 走了 L + y,fast 走了 L + y + x, slow 走了 x + y
    // 而 fast = 2 slow  ==> 2(x + y) = L + x + y
    // x + y = L ==> x = L - y

    ListNode* slow = head;  // 慢指针一次走一步
    ListNode* fast = head;  // 快指针一次走两步
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;

        if (slow == fast) {  // 相遇
            ListNode* p = head;

            while (p != slow) {  // x = L - y
                p    = p->next;
                slow = slow->next;
            }

            return p;
        }
    }
    return nullptr;
}

易错点

总结

相关题目