Leetcode 142:環形連結串列 II(最詳細的解法!!!)
阿新 • • 發佈:2018-11-09
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null
。
**說明:**不允許修改給定的連結串列。
進階:
你是否可以不用額外空間解決此題?
解題思路
這是之前問題Leetcode 141:環形連結串列(最詳細的解法!!!)的提高,我們還是採用快慢指標來做。
我們建立兩個指標,一個slow
一個fast
,我們令移動速度關係為
,我們假設環的長度為
的倍數k
,如果此時slow
和fast
都在環內的話,那麼在一定時間內兩者必定可以相遇(使用相對速度很好理解)。如果此時slow
的起點是在環的初始點(例如前面例子中的3
),那麼fast
和slow
最後一定會在起點相遇(因為
一定為0
,其中後面的
為相對速度)。我們現在的問題就變成了如何判斷slow
在環的初始點,這也非常簡單,我們再簡歷一個entry
指標,當slow==fast
的時候,我們判斷slow==entry
,如果是的話,那麼entry
即為環的初始點,否則的話我們將entry++;slow++;
,判斷下一個位置是不是環的起始點。
class Solution:
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None:
return None
fast, slow, entry = head, head, head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
while slow != entry:
slow = slow.next
entry = entry.next
return entry
return None
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!