鍊錶相交問題

2021-06-18 10:54:47 字數 1833 閱讀 2763

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、 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點(兩個鍊錶都不存在環)。

比較好的方法有兩個:

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

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

這時我們記下兩個鍊錶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;

}

鍊錶相交問題

問題描述 給定兩鍊錶的頭結點,判斷兩鍊錶是否存在公共部分 相交 若相交返回相交的第乙個節點。經分析發現該問題可以分成如下兩個子問題進行解決。子問題一 兩無環鏈表是否相交 演算法一 假設list1長度為l1,list2長度為l2,假設公共部分長為m,由l1 l2 m l2 l1 m可知第一路先遍歷li...

兩鍊錶相交問題

1 兩個鍊錶相交,那麼兩個鍊錶中的節點一定有相同位址。2 兩個鍊錶相交,那麼兩個鍊錶從相交節點開始到尾節點一定都是相同的節點。問 為什麼?答 因為每乙個節點最多只能有乙個下一節點,因此在相交節點之後,鍊錶不可能再分為兩個鍊錶 根據兩個鍊錶是否存在環來分類討論 無環的情況有兩種比較快速的解決方式,這兩...

求鍊錶相交節點問題

給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,...