鍊錶拓展問題

2021-07-13 11:48:03 字數 1071 閱讀 6757

在網上蒐集了一下這個問題相關的一些問題,思路開闊了不少,總結如下:

1. 環的長度是多少?

2. 如何找到環中第乙個節點(即linked list cycle ii)?

3. 如何將有環的鍊錶變成單鏈表(解除環)?

4. 如何判斷兩個單鏈表是否有交點?如何找到第乙個相交的節點?

首先我們看下面這張圖:

設:煉表頭是x,環的第乙個節點是y,slow和fast第一次的交點是z。各段的長度分別是a,b,c,如圖所示。環的長度是l。slow和fast的速度分別是qs,qf。

下面我們來挨個問題分析。

1. 方法一(網上都是這個答案):

第一次相遇後,讓slow,fast繼續走,記錄到下次相遇時迴圈了幾次。因為當fast第二次到達z點時,fast走了一圈,slow走了半圈,而當fast第三次到達z點時,fast走了兩圈,slow走了一圈,正好還在z點相遇。

方法二:

第一次相遇後,讓fast停著不走了,slow繼續走,記錄到下次相遇時迴圈了幾次。

方法三(最簡單):

第一次相遇時slow走過的距離:a+b,fast走過的距離:a+b+c+b。

因為fast的速度是slow的兩倍,所以fast走的距離是slow的兩倍,有 2(a+b) = a+b+c+b,可以得到a=c(這個結論很重要!)。

我們發現l=b+c=a+b,也就是說,從一開始到二者第一次相遇,迴圈的次數就等於環的長度。

2. 我們已經得到了結論a=c,那麼讓兩個指標分別從x和z開始走,每次走一步,那麼正好會在y相遇!也就是環的第乙個節點。

3. 在上乙個問題的最後,將c段中y點之前的那個節點與y的鏈結切斷即可。

4. 如何判斷兩個單鏈表是否有交點?先判斷兩個鍊錶是否有環,如果乙個有環乙個沒環,肯定不相交;如果兩個都沒有環,判斷兩個列表的尾部是否相等;如果兩個都有環,判斷乙個鍊錶上的z點是否在另乙個鍊錶上。

如何找到第乙個相交的節點?求出兩個鍊錶的長度l1,l2(如果有環,則將y點當做尾節點來算),假設l1

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

LeetCode 反轉鍊錶(鍊錶問題)

難度 簡單 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null使用三個listnode,分別是prev,curr,next。curr是當前指標指向的節點,prev是curr的前乙個節點,頭節點的前乙個節點是null,next是curr的下乙個節點,用於遍歷鍊...

後序拓展序列與相關(基於鍊錶實現)

序 構造出一棵二叉樹的方法有很多,基於 序拓展序列也可以構造出亦可唯一的一棵二叉樹,本文給出基於後序拓展序列生成二叉樹 基於鍊錶實現 何謂後續拓展序列?後續拓展序列指在二叉樹的後續遍歷序列中增加空節點的序號。input 一行字元,即擴充套件後序序列output 輸出對應的前序遍歷結果思路 通過棧來實...