如何判斷兩個鍊錶是否相交並找出交點

2021-10-06 05:16:45 字數 2377 閱讀 9883

情況1:兩個鍊錶均不含有環

1、直接法

採用暴力的方法,遍歷兩個鍊錶,判斷第乙個鍊錶的每個結點是否在第二個鍊錶中,時間複雜度為o(len1*len2),耗時很大。

2、hash計數法

如 果 兩個鍊錶相交,則兩個鍊錶就會有共同的結點;而結點位址又是結點唯一標識。因而判斷兩個鍊錶中是否存在位址一致的節點,就可以知道是否相交了。可以對第一 個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的位址查詢hash表,如果它在hash表**現,則說明兩個鍊錶有共 同的結點。這個方法的時間複雜度為:o(max(len1+len2);但同時還得增加o(len1)的儲存空間儲存雜湊表。這樣減少了時間複雜度,增加 了儲存空間。

以鍊錶節點位址為值,遍歷第乙個鍊錶,使用hash儲存所有節點位址值,結束條件為到最後乙個節點(無環)或hash中該位址值已經存在(有環)。

再遍歷第二個鍊錶,判斷節點位址值是否已經存在於上面建立的hash表中。

這個方面可以解決題目中的所有情況,時間複雜度為o(m+n),m和n分別是兩個鍊錶中節點數量。由於節點位址指標就是乙個整型,假設鍊錶都是在堆中動態建立的,可以使用堆的起始位址作為偏移量,以位址減去這個偏移量作為hash函式

3、轉換為環的問題

第三種思路是比較奇特的,在程式設計之美上看到的。先遍歷第乙個鍊錶到他的尾部,然後將尾部的next指標指向第二個鍊錶(尾部指標的next本來指向的是null)。這樣兩個鍊錶就合成了乙個鍊錶,判斷原來的兩個鍊錶是否相交也就轉變成了判斷新的鍊錶是否有環的問題了:即判斷單鏈表是否有環?

這樣進行轉換後就可以從鍊錶頭部進行判斷了,其實並不用。通過簡單的了解我們就很容易知道,如果新煉表是有環的,那麼原來第二個鍊錶的頭部一定在環上。因此我們就可以從第二個鍊錶的頭部進行遍歷的,從而減少了時間複雜度(減少的時間複雜度是第乙個鍊錶的長度)。這種方法可以判斷兩個鍊錶是否相交,但不太容易找出他們的交點。

4、進一步考慮「如果兩個沒有環的鍊錶相交於某一節點,那麼在這個節點之後的所有節點都是兩個鍊錶共有的」這個特點,我們可以知道,如果它們相交,則最後乙個節點一定是共有的。而我們很容易能得到鍊錶的最後乙個節點,所以這成了我們簡化解法的乙個主要突破口。那麼,我們只要判斷兩個鍊錶的尾指標是否相等。相等,則鍊錶相交;否則,鍊錶不相交。

情況2:鍊錶有環時

1:假設兩個鍊錶都有環,情況只有2種

相交於」環上」或相交於」不是環的部分」。因此環一定是在公共部分上的。假如知道其中乙個鍊錶上環的任意乙個節點,則只需要判斷是否在另乙個鍊錶上就行了

2:當乙個鍊錶中有環,乙個鍊錶中沒有環時,兩個鍊錶必不相交

建立在這兩篇部落格的基礎上

1:如何實現鍊錶

2:如何知道鍊錶是否有環

public

function

detect

($linklist1

,$linklist2

)//兩個都無環,判斷最後乙個節點是否相等

elseif(!

$isloop1&&!

$isloop2

)for($j

=0;$j

<

$size2;$j

++)if(

$p1!=

$p2)

return

true;}

//兩個都有環,判斷環裡的節點是否能到達另乙個鍊錶環裡的節點

else

$circlenode1

=$circlenode1

->

next;}

return

false;}

return

false

;}

求相交的第乙個元素

function

findnode

($linklist1

,$linklist2

)$diff

=abs

($linklist1

->

size

-$linklist2

->

size);

if($linklist1

->

size

>

$linklist2

->

size

)else

for($i=

0;$i<

$diff;$i

++)while

($p1

!=null

)$p1

=$p1

->

next

;$p2

=$p2

->

next;}

return

null

;}

判斷兩個鍊錶是否相交並找出交點

問題描述 乙個比較經典的問題,判斷兩個鍊錶是否相交,如果相交找出他們的交點。思路 1 碰到這個問題,第一印象是採用hash來判斷,將兩個鍊錶的節點進行hash,然後判斷出節點,這種想法當然是可以的。2 當然採用暴力的方法也是可以的,遍歷兩個鍊錶,在遍歷的過程中進行比較,看節點是否相同。3 第三種思路...

判斷兩個鍊錶是否相交並找出交點

問題描述 乙個比較經典的問題,判斷兩個鍊錶是否相交,如果相交找出他們的交點。思路 1 碰到這個問題,第一印象是採用hash來判斷,將兩個鍊錶的節點進行hash,然後判斷出節點,這種想法當然是可以的。2 當然採用暴力的方法也是可以的,遍歷兩個鍊錶,在遍歷的過程中進行比較,看節點是否相同。3 第三種思路...

判斷兩個鍊錶是否相交並找出交點 筆記

本文內容並非全部為原創,新增個人想法僅做筆記之用。判斷兩個鍊錶是否相交的方法 相交鍊錶的特徵 如果兩個鍊錶相交,那麼交點以後的節點都相同,否則不相交。這個地球人都懂得 兩個鍊錶的節點進行hash,然後判斷節點hash值和節點的值是否相等來判斷。乙個鍊錶的尾部連線下乙個鍊錶的頭部,通過判斷新鍊錶是否有...