1. 程式人生 > 其它 >leetcode 環形連結串列II 中等

leetcode 環形連結串列II 中等

// 假設有環, 從 head 到環入口有 a 個節點, 環大小為 b 個節點, c 表示從環入口到停下來地方的結點數
// slow 與 quick 相遇時有等式: 2 * (a + x * b + c) = a + y * b + c
// 即 2 * a + 2 * x * b + 2 * c = a + y * b + c
// a = -c + (y - 2 * x) * b
// 顯然 a >= 0. 所以換句話說就是, a = 若干圈 * b - c, 也就說 (若干圈 - 1) * b + (b - c)
// 所以, 從起點開始, 和停下來的地方繼續同步走, 再次相遇的地方就是 環入口

class Solution {
public: ListNode *detectCycle(ListNode *head) { if(head == nullptr || head -> next == nullptr) return nullptr; ListNode *slow = head -> next, *quick = head -> next; while(quick && slow != quick) { slow = slow -> next; quick = quick -> next;
if(quick) quick = quick -> next; } if(quick == nullptr) return nullptr; // 有環, 接下來 quick 與 slow 一樣, 一次走一步, 當 quick 再次等 // 於 slow, 則此點為入口 slow = head; while(slow != quick) { slow = slow -> next; quick = quick -> next; }
return slow; } };