程式設計之美 鍊錶相交問題

2021-06-06 08:54:33 字數 1931 閱讀 3725

1 判斷兩個鍊錶是否相交(假設兩個鍊錶均不帶環)

有四種方法:

解法1:直觀的想法

判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為o(length(h1)*length(h2))

解法2:利用計數的方法

對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的位址查詢hash表,如果它在hash表中出現,那麼說明兩個鍊錶有共同的節點。時間複雜度為o(length(h1)+length(h2)),空間複雜度為o(length(h1))

解法3:轉化為另乙個已知的問題

由於兩個鍊錶沒有環,可以把第二個鍊錶接在第乙個鍊錶後面,如果得到的鍊錶有環,則說明這兩個鍊錶相交,否則,這兩個鍊錶不相交,這樣把問題轉化為判斷乙個鍊錶是否有環

解法4:

先遍歷第乙個鍊錶,記住最後乙個節點,在遍歷第二個鍊錶,到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相同,則相交,否則,不相交,時間複雜度為:o(length(h1)+length(h2))

2 判斷兩個鍊錶是否相交(假設兩個鍊錶均帶環)

解法:先遍歷第乙個鍊錶,記住最後乙個節點,在遍歷第二個鍊錶,看第乙個個鍊錶的尾節點是否存在於第二個鍊錶中,存在,則相交。

3 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點(兩個鍊錶都不存在環)。

比較好的方法有兩個:

一、將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。

二、如果兩個鍊錶相交,那個兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷乙個鍊錶,直到尾部,再遍歷另外乙個鍊錶,如果也可以走到同樣的結尾點,則兩個鍊錶相交。

這時我們記下兩個鍊錶length,再遍歷一次,長鍊表節點先出發前進(lengthmax-lengthmin)步,之後兩個鍊錶同時前進,每次一步,相遇的第一點即為兩個鍊錶相交的第乙個點。

4 判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。

問題:1)、如何判斷乙個鍊錶是不是這類鍊錶?

2)、如果鍊錶為存在環,如何找到環的入口點?

一》判斷鍊錶是否存在環,辦法為:

設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為null,則為無環鏈表)程式如下:

bool i***itsloop(slist *head)

return !(fast == null || fast->next == null);

}二》找到環的入口點

當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。假設slow走了s步,則fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:

2s = s + nr

s= nr

設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。

a + x = nr

a + x = (n – 1)r +r = (n-1)r + l - a

a = (n-1)r + (l – a – x)

(l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點,於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。程式描述如下:

slist* findloopport(slist *head)

if (fast == null || fast->next == null)

return null;

slow = head;

while (slow != fast)

return slow;

}

《程式設計之美》兩鍊錶相交及擴充套件詳解

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

《程式設計之美》讀書筆記(十) 「鍊錶相交」擴充套件問題

感謝azuryy 提供 程式設計之美 3.6節 鍊錶相交 擴充套件問題答案 擴充套件1 鍊錶1 步長為1,鍊錶2步長為2 如果有環且相交則肯定相遇,否則不相交 list1 head p1 list2 head p2 while p1 p2 p1 null p2 null if p1 p2 p1 p2...

鍊錶相交問題

1 判斷兩個鍊錶是否相交 假設兩個鍊錶均不帶環 有四種方法 解法1 直觀的想法 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為o length h1 length h2 解法2 利用計數的方法 對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的...