链表中环的入口结点
解題描述
方法1 - 哈希法,需要額外空間
1、遍歷單鏈表的每個結點
2、如果當前結點地址沒有出現在set中,則存入set中
3、否則,出現在set中,則當前結點就是環的入口結點
4、整個單鏈表遍歷完,若沒出現在set中,則不存在環
時間復雜度O(N):其中 N 為鏈表中節點的數目。遍歷整個鏈表的結點
空間復雜度O(N):其中 N 為鏈表中節點的數目。我們需要將鏈表中的每個節點都保存在哈希表當中。
方法2 - 雙指針,不需要額外空間
我們使用兩個指針,fast 與 slow。
1、它們起始都位于鏈表的頭部。隨后,slow 指針每次向后移動一個位置,而fast 指針向后移動兩個位置。如果鏈表中存在環,則 fast 指針最終將再次與 slow 指針在環中相遇。
2、當發現 slow 與 fast 相遇時,我們再額外使用一個指針 cur。起始,它指向鏈表頭部;隨后,它和 slow 每次向后移動一個位置。最終,它們會在入環點相遇
會在節點5相遇。
圖解:
分析:
這其實是一道數學題。
1、初始化:快指針fast指向頭結點, 慢指針slow指向頭結點
2、讓fast一次走兩步, slow一次走一步,第一次相遇在C處,停止
3、然后讓fast指向頭結點,slow原地不動,讓后fast,slow每次走一步,當再次相遇,就是入口結點。
如上解釋:
如果慢指針slow第一次走到了B點處,距離C點處還有距離Y,那么fast指針應該停留在D點處,且BD距離為Y(圖中所示是假設快指針走了一圈就相遇,為了便于分析),
也就是DB+BC=2Y,(因為fast一次走2步,慢指針一次走1步,并且相遇在C處)
在C點處,此時慢指針slow走的點為ABC,距離為X+Y,而快指針fast走的點為ABCDBC,距離為慢指針的2倍,也就是2X+2Y,
又因為:AB=X,BC=Y,快指針走了2次BC,所以CDB距離為X,而AB距離也為X。
所以,額外搞一個cur指針從頭觸發,與滿指針一起,那么相遇的點就是B點,因為走過的距離為CDB,也就是AB。
時間復雜度O(N):其中 N 為鏈表中節點的數目。在最初判斷快慢指針是否相遇時,slow 指針走過的距離不會超過鏈表的總長度;隨后尋找入環點時,走過的距離也不會超過鏈表的總長度
空間復雜度O(1):額外使用的指針占用常數空間
總結
- 上一篇: SAK类型区分
- 下一篇: Faster rcnn 配置时出现bTe