Easy 141. Linked List Cycle
In this blog I will share a solution to the Linked List Cycle problem.
題目連結
難度:Easy
給定一個 Linked List,判斷其中是否包含 cycle,如果 Linked List 中存在 cycle,則返回 true;否則,返回 false。Example 1:Example 2:Example 3:
限制
- 鏈結串列中的節點數在範圍 0, 10^4 內
- -10^5 <= Node.val <= 10^5
- pos 為 -1 或一個有效的索引
Linked List
Two Pointers
Hash Table
Cycle Detection
什麼是 cycle?
cycle 的形成與節點值無關,而是取決於節點之間的連接方式:
- 無 cycle 的情況:
- 有 cycle 的情況:
實務應用情境
在實際開發中,「cycle」的檢測有許多重要應用:
- 記憶體洩漏檢測
- 死鎖檢測
- 循環依賴
範例
解題思路
這題使用「龜兔賽跑」算法(又稱 Floyd's Cycle Finding Algorithm)來解,可以想像一個跑道上有兩個跑者(烏龜和兔子):
- 基本概念:
- 烏龜(慢跑者):每次跑 1 步
- 兔子(快跑者):每次跑 2 步
- 如果是環形跑道,兔子一定會追上烏龜
- 如果是直線跑道,兔子會先到終點
- 圖解過程:
程式碼實作
技術重點
- 龜兔賽跑策略:
- 讀了題目一陣子還是不知道在說什麼 XD
- 查找網路上的解法,發現這個比喻很好
- 兔子(快跑者)一次跑 2 步
- 烏龜(慢跑者)一次跑 1 步
- 環形跑道上,快的一定會追上慢的
複雜度分析
- 時間複雜度:O(n)
- n 是節點數量
- 最多遍歷一次鏈結串列
- 空間複雜度:O(1)
- 只使用兩個指針
- 不需要額外空間
#footer
Linked List
Two Pointers
:: ::