142. Linked List Cycle II
種類 : linked list
難度 : medium
題目 : 142. Linked List Cycle II
思維邏輯
graph LR A[3] --> B[2] --> C[0] --> D[-4] --> B
判斷是否有迴圈
慢指針一次往前一個node、快指針一次往前兩個node,最後終會相交(指向相同node)如何找出迴圈入口
設$x$: head -> entrance節點數量
設$y$: entrance -> 快慢指針相交的節點數量
設$z$: 快慢指針相交的節點 -> entrance節點數量當slow與fast相交時,
slow經過的節點數量為$x+y$
fast經過的節點數量為$x+y+n(y+z)$,$y+z$從相交點的一個循環,$n$為循環次數
因fast節點為slow兩倍,可得
$$2(x+y) = x+y+n(y+z)$$
兩側消除$x+y$,可得
$$x+y = n(y+z)$$
將右側$n$提出$-1$,可得
$$x+y = (n-1)(y+z)+y+z$$
$$x = (n-1)(y+z)+z$$
這裡$(n-1)$可以得知:相交時,fast最少已經跑過1次循環
而當$n=1$(也就是fast跑完1次循環後),可得
$$x=z$$
這意味著:此時head -> entrance與相交點->entrance距離相同(雖然是廢話但我想很久😂)
白話一點就是,現在我們已經到相交點了,再設一個指針從head開始跑,下次和這個指針相遇的節點就是entrance🎉🎉
解法
1 | """ |
時間複雜度: O(n)
空間複雜度: O(1)
難點
- 如何判斷是否有cycle
- 找出迴圈的入口,需數學推導
最佳解法
1 | """ |
時間複雜度: O(n)
空間複雜度: O(n)