快慢指針法
算法步驟
- 初始化快慢指針
- 循環處理,快指針走兩步,慢指針走一步,直到發現環或者到達鏈表結尾
偽代碼
// 1. 節點數為1和2的情況
if head == head.next
return true
slow = head
fast = head.next != null ? head.next.next : null
if slow == fast
return true
// 2. 循環
for fast ≠ null and slow ≠ fast
if fast.next ≠ null
fast = fast.next.next
else
return false
slow = slow.next
return fast ≠ null and fast == slow
環起點的問題
快慢指針法可以簡化為“追擊問題”,即在慢指針進入環的那一刻,快指針開始追擊慢指針。如何求進入環的點?
image.png
解:
相遇時有公式
將(1)、(2)代入(3)有,
進而有,
可知道相遇時,相遇點與起點的距離為環的整數倍。
所以,可以通過將指針分別置于起點和相遇點,以步長為1遍歷,兩個指針必然會在環起點相遇。
p1 = meetPoint
p2 = head
while p1 != p2
p1 = p1.next
p2 = p2.next
return p1