142 環形鍊錶 II

2021-10-24 15:30:08 字數 935 閱讀 5165

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。

說明:不允許修改給定的鍊錶。

看到這種環鏈表就容易想到了快慢指標,令煉錶環外部的長度為a,當慢指標走完a在環裡b與快指標相遇時,慢指標走了a + b的距離,快指標在環裡走了n圈和慢指標相遇,走了a + b + n(b + c)的距離,b + c為環長度。

又因為快指標的距離為慢指標的兩倍,所以2(a + b)= a + b + n(b + c)

得出a = (n - 1)(b + c)+ c

因而a的距離剛好等於n - 1圈環長度 + 相遇時剩餘環長度c,所以在快慢指標相遇時,令乙個tmp指標從起點出發,待慢指標和tmp相遇時,就是環的起點

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

listnode* fast = head;

listnode* slow = head;

do fast = fast -

> next -

> next;

slow = slow -

> next;

}while

(slow != fast)

; listnode* tmp = head;

while

(tmp != slow)

return slow;}}

;

142 環形鍊錶 II

還是快慢指標的問題,當發現有環時,將fast指向head,fast一次向前移動乙個節點,則fast和slow一定會在環的入口相遇.證明 設s為slow指標走的節點個數,m為環的入口距head的位置 則第一次相遇時,fast和head相對於環入口的位置相同,fast在環中的相對於環入口的位置在 2s ...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.struct listnode class solution node set.insert...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...