LeetCode 142 環形鍊錶 II

2021-10-23 14:18:51 字數 1724 閱讀 1458

思路:

採用雙指標

準備乙個快指標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 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...