剑指 Offer II 022. 链表中环的入口节点

发布时间 2023-05-03 15:10:10作者: lixycc

题目链接:剑指 Offer II 022. 链表中环的入口节点

方法一:哈希

解题思路

统计走过的节点,当第一次遇到重复的节点时,即为入口节点,否则为 \(null\)

代码

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_map<ListNode*, bool> cache;
        while (head) {
            if (cache.count(head)) break;
            cache[head] = true;
            head = head->next;
        }
        return head;
    }
};

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)

方法二:快慢指针

解题思路

Krahets题解

代码

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while (true) {
            if (!fast || !fast->next) return NULL;
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow) break;
        }
        fast = head;
        while (fast != slow) {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)