對於乙個給定的鍊錶,返回環的入口節點,如果沒有環,返回null
拓展:你能給出不利用額外空間的解法麼?
牛客上的乙個題目,判斷是否有環,使用快慢指標即可,要找到環的入口就需要再分析一下
方法一:
因為快指標的速度是慢指標的2倍,所以當快慢指標第一次相遇時,快指標走過的路程(暫時就這麼叫)是慢指標的2倍
所以可以得出如下等式:假設快慢指標相遇時,快指標已經繞了n圈
2(x+y)=x+y+n*(y+z)
整理一下可得
x=(n-1)(y+z)+z
可以發現y+z恰好是環的一圈,x等於n-1圈環加z,所以第一次相遇後慢指標回到起點,快慢指標以相同的速度向前走(一次走一格),
當慢指標走了x長的路程時,快指標繞了n-1圈並且還走了z,這時他們恰好相遇在入口(真巧)
1方法二(可先看**):/**2
* definition for singly-linked list.
3* class listnode
10* }
11*/
12public
class
solution
17 listnode slow =head;
18 listnode fast =head;
19while(fast != null && fast.next != null)25
}26if(fast == null || fast.next == null
)29 slow =head;
30while(slow !=fast)
34return
slow;35}
36 }
這裡必須加判斷,否則會出現空指標異常
26 t =fast.next;27}
2829 slow =head;
30while(slow !=t )
34return
slow;35}
36 }
方法二是看了leetcode141的題解才有的想法,但是沒有方法一,直接方法二就有點困難。我覺得方法二有點雞肋
鍊錶中環的入口節點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過141題,我們知道可以通過快慢指標來判斷是否有環,現在我們假設兩個指標相遇在z點,如圖 那麼我們可以知道fast指標走過a b c b slow指標走過a b 那麼2 a b a b c b 所以a c 那麼此時讓slow回到起點,fast依然...
鍊錶中環的入口節點
題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。演算法描述 受之前的面試題的啟發,如果我們在乙個有環的鍊錶中設定兩個鍊錶指標,乙個快,乙個慢,那麼兩個鍊錶指標相遇的時候,必然是位於鍊錶中的某個結點,利用這個結點,當我們從這個結點開始繼續遍歷,當再一次回到這個結點的時候,我們可以統計出環中的結...
鍊錶中環的入口節點
題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。解題思路 假設x為環前面的路程 黑色路程 a為環入口到相遇點的路程 藍色路程,假設順時針走 c為環的長度 藍色 橙色路程 第一步 找環中相匯點。分別用p1,p2指向鍊錶頭部,p1每次走一步,p2每次走二步,直到p1 p2找到在環中的相匯點。此時...