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

2021-08-07 11:56:28 字數 2897 閱讀 6531

引言:鍊錶問題是資料結構中的常見問題,對於面試、筆試都有很大的作用,那麼如何判斷兩個鍊錶是否相交並找出第乙個相交節點?

分析:找出兩個鍊錶的交點首先就是判斷鍊錶是否相交,那麼首先來看什麼是兩個鍊錶相交?

一、什麼是鍊錶相交?

資料結構的鍊錶定義中儲存了指向下乙個元素的指標,如果當兩個鍊錶有交點時,即兩個鍊錶會在各自鍊錶中的某個結點,同時指向了相同的下乙個結點,即如下圖所示: 

圖中可以看出,從鍊錶一和鍊錶二的相交處開始,後續結點都為相同結點。

此外,還要記住以下幾點:

①相交的兩個單鏈表要麼均有環,要麼都沒有環

②乙個有環的單鏈表和乙個無環的單鏈表不可能相交

二、怎麼判斷兩個鍊錶是否相交?

先判斷兩個單鏈表是否有環,若乙個有環,乙個無環,則肯定不相交,剩下的情況要麼兩個單鏈表都有環,要麼都沒有環。

兩個單鏈表都為無環情況:

方法一:根據上圖鍊錶相交,可知,最簡單的方法是判斷兩個鍊錶的最後乙個結點是否相等,如果相等,那麼這兩個鍊錶就相交。時間複雜度為o(len1+len2)。

方法二:依次判斷第乙個鍊錶中的每個節點是否在第二個鍊錶中出現,若出現,則兩個鍊錶相交。時間複雜度為o(len1*len2),該時間複雜度比較大。

方法三:如下圖所示

首先遍歷第乙個鍊錶,找到它的尾部,並讓它指向第二個鍊錶的頭部,然後兩個鍊錶就合二為一,成為了乙個新的組合鍊錶,現在只需要判斷新的鍊錶是否含有環即可。因為第二個鍊錶頭部在環上,所以從第二個鍊錶開始遍歷判斷是否有環,可以減少時間複雜度,減少的為鍊錶a的長度,最終時間複雜度為o(len1+len2)。

方法四:首先將第乙個鍊錶所有節點位址進行hash排序,並建立hash表,然後將第二個鍊錶中每個節點位址進行判斷,看是否在hash表中存在,弱國存在,則兩個鍊錶相交,時間複雜度為o(len1+len2)。

兩個單鏈表都為有環情況(三種情況):

①第乙個相交節點在環開始之前:

②第乙個相交節點在環入口處:

③第乙個相交節點在環內:

前兩種相交的節點在環之前,和環開始的地方,對於他們來說第一次相交的節點是相同的。

但對於第三種情況,即相交在環內的情況來看,如圖,對於鍊錶一來說,p1點是第一次相交的節點,對於鍊錶二來說p2點是第一次相交的節點。

判斷相交方法:

方法一:將其中任意乙個鍊錶的環打破,即讓尾節點指向null(記住儲存原本應當指向的位置),然後判斷第二個鍊錶是否含有環,若第二個鍊錶中無環,則兩個鍊錶相交,否則不相交(記住,兩個鍊錶本身就是有環的,乙個有環的鍊錶和乙個無環的鍊錶不存在相交點)。

方法二:利用判斷單鏈表是否有環的方法,對鍊錶一使用兩個快慢指標進行判斷是否有環,兩個指標的碰撞點即在環上,那麼判斷鍊錶二的環上是否包含該碰撞點就可以判斷兩個鍊錶是否相交了。

三、怎麼找到兩個鍊錶的第乙個相交節點?

兩個單鏈表都為無環情況:

方法一:依次判斷第乙個鍊錶中的每個節點是否在第二個鍊錶中出現,第乙個出現在鍊錶二中的節點即為第乙個相交節點。

方法二:人為構造環,如下圖

首先遍歷第乙個鍊錶,找到它的尾部,並讓它指向第二個鍊錶的頭部,然後兩個鍊錶就合二為一,成為了乙個新的組合鍊錶,找到新鍊錶的環入口節點,即為兩個鍊錶相交的第乙個節點。

方法三:分別遍歷兩個鍊錶,記錄鍊錶長度len1,len2。用兩個指標指向兩個鍊錶的頭部,讓長度較長的鍊錶先走|len1-len2|步,然後兩個指標共同走,當兩個指標相等時,即為第乙個相交鍊錶。

兩個單鏈表都為無環情況:

方法一:第乙個相交節點在環之前和環入口節點的情況的方法,如上述方法三。

方法二:第乙個相交節點在環內的情況方法如下,分別找到鍊錶一和鍊錶二的環入口節點,各自的環入口節點即為各自第一次相交的節點。即為下圖中的p1和p2節點。

四、總結

如果兩個單鏈表相交,那麼一定是都有環或者都沒有環,不存在乙個有環乙個沒環的兩個鍊錶相交。所以,判斷鍊錶相交,首先判斷兩個鍊錶是否有環。

根據有環和無環的情況,分別處理,判斷出是否相交,進而找出第乙個相交節點。

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

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

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

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

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

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