思路:
採用雙指標
準備乙個快指標fast,乙個慢指標slow,快指標一次走兩步,慢指標一次走一步
初始時,快指標fast位於頭節點的下乙個節點,慢指標slow位於頭節點
fast節點和slow節點同時開始向後走,若存在環,則一定會有乙個時刻fast和slow指向同乙個節點。若不存在,則最終fast走到null或者fast.next為null
若存在環,此時,slow和fast都位於環上
開始尋找第乙個入環點:
尋找入環點的思路是:環的長度 + 未形成環的長度 = 鍊錶總長度,第乙個入環節點一定是未形成環路的最後乙個節點的下乙個節點,當拿到環的長度之後,先讓乙個節點從頭走乙個環的長度,然後另乙個節點也從頭開始,兩個節點一起走,每次走一步,當相遇時,即為第乙個入環點
這是因為此時這兩個節點恰好走的長度為未形成環的長度,對於先走的那個節點來說,它走的總長度恰好為整個鍊錶的長度,而後面走的節點,與先走的節點相遇時,走過的長度恰好是未形成環的長度,故相遇時即為第乙個入環點。
例:先判斷是否有環路,s和f分別代表slow和fast,slow一次一步,fast一次兩步,最終會在節點6處相遇
s f
1->2->3->4 1->2->3->4
⬆ ⬇ -> ... -> ⬆ ⬇
7<-6<-5 7<-6<-5
s,f
尋找入環點。f先走,一次一步,計算環的長度=6,f從頭開始走6步,達到節點7。s從頭開始,和f一起走,會在節點2相遇,節點2就是第乙個入環節點
s s,f
1->2->3->4 1->2->3->4 1->2->3->4
⬆ ⬇ -> ⬆ ⬇ -> ⬆ ⬇
7<-6<-5 7<-6<-5 7<-6<-5
f f
**:
public listnode detectcycle(listnode head)
// 快指標
listnode fast = head.next;
// 慢指標
listnode slow = head;
// 檢視是否有環
while (fast != null && fast.next != null)
slow = slow.next;
fast = fast.next.next;
}if (fast == null || fast.next == null)
int length = 1;
fast = fast.next;
// 計算環的長度
while (fast != slow)
// fast從頭開始往後走乙個環的長度
fast = head;
while (length-- > 0)
// slow從頭開始,fast和slow同時一次一步,最終在入環點相遇
slow = head;
while (slow != fast)
return slow;
}class listnode
}
leetcode 142 環形鍊錶
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...
leetcode 142環形鍊錶
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。example 輸入 head 3,2,0,4 pos 1...
Leetcode 142 環形鍊錶
問題重述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...