2種思路:
首先我們假設有個帶環鍊錶list1,如圖我們可以這麼做:
這樣問題就轉換成了如何求出2個不帶環鍊錶的相交節點
很明顯你會問如何在環中找到乙個節點,你不可能去遍歷(會死迴圈),有這樣乙個辦法,我們設定乙個快慢指標first,second,快指標一次走2個節點,慢指標一次走乙個節點,那麼它們最終在環內相遇。
你會問:如果快指標每次都跳過慢指標那?
當然不會。
證明如下:
我們可以利用反證法:假設快指標會跳過慢指標
假設在一次移動後在first在second的前乙個點,即first跳過second,那麼我們使first,second各向後移動一次,first與second重合,即它們在之前已經相遇,原命題錯誤。
那我們可以寫出這段**:
listnode *first = phead;
listnode *second = phead;
//判斷條件是為了判斷鍊錶是否帶環
while ( first && first->next != null )
}
找到這個點之後,我們就可以把原鍊錶斷開
對於怎麼找到2個不帶環鍊錶的思路,為了簡便,我把我的另一條鏈結貼在這吧:
現在,我們來說第二種方法:
我們在第一種解法中找到了乙個環內節點 f ,第二種思路是再讓乙個指標third指向頭結點,讓third與 f 同速度往前走,它們相等的點即為入口節點。
證明如下:
尋找帶環鍊錶入口
求解單鏈錶環入口點的步驟 1 使用 指標追趕 方法找到相遇點 網上資料很多,此處略 2 指標p1從煉表頭 p2從相遇點,同時出發,一次移動乙個節點,再次的相遇點便是環的入口點。理解了好久,終於證明了為什麼步驟2那樣就能找到入口點。證明導向 p1從表頭走,能與p2從相遇點走再次相遇,那麼說明p1走到入...
找到鍊錶環的入口
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。1 設定一對快慢指標,都從煉表頭出發 快指標每次走兩步,慢指標每次一步 2 找到兩個指標在環上的相遇點 3 設定兩個指標,分別從煉表頭和相遇點出發 4 上面兩個指標相遇的地方即為環入口 快慢指標都從頭開始,這樣可以保證只有環的情況下,快慢指標是在head...
鍊錶中環的入口節點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過141題,我們知道可以通過快慢指標來判斷是否有環,現在我們假設兩個指標相遇在z點,如圖 那麼我們可以知道fast指標走過a b c b slow指標走過a b 那麼2 a b a b c b 所以a c 那麼此時讓slow回到起點,fast依然...