判斷兩個鍊錶是否相交

2021-08-31 19:33:02 字數 1493 閱讀 6492

題目

給出兩個鍊錶的頭指標,比如h1,h2,判斷這兩個鍊錶是否相交。

擴充套件:

(1) 如果鍊錶可能有環呢?

(2) 如何求出兩個相交鍊錶的相交的第乙個節點。

如果鍊錶沒有環

假設兩個鍊錶沒有環,如果它們相交,那麼它們的最後乙個元素必定相同。

public boolean isconnloop(listnode h1, listnode h2)
它們的交點為

public listnode findpointnloop(listnode h1, listnode h2) 

while (n2 != null)

n1 = h1;

n2 = h2;

if (len1 < len2)

for (int i = len1-len2; i > 0; i--)

n1 = n1.next;

while (n1 != null && n1 != n2)

return n1;

}

如果鍊錶有環如果鍊錶有環且相交,那麼這兩個鍊錶都是有環的。

找到第乙個鍊錶的環點,然後將環斷開(當然不要忘記了儲存它的下乙個節點),然後再來遍歷第二個鍊錶,如果發現第二個鍊錶從有環變成了無環,那麼他們就是相交的嘛,否則就是不相交的了。

public boolean isconloop(listnode h1, listnode h2)  else 

}public listnode loopentry(listnode head)

if (fast == slow)

return slow;

} return null;

}

尋找環點的方法如下:

兩個指標,乙個走一步,乙個走兩步,在環中相遇位置為x。然後從頭節點和x位置,分別一步一步的走,每次判斷是否相遇,相遇點就是所求節點。

證明如下:假設頭節點位置為a,環點為m,相遇節點為x,環長為len。

因為快節點每次比慢節點快一步,慢節點進入環後快節點不用一圈就能趕上慢節點了。

慢節點走的路程 = am + mx

快節點走的路程 = am + mx  + n * len

=> 2*(am + mx ) = am + mx + n *len

=> am + mx = n*len

=> am = (n-1)*len + xm,說明從a到m的距離與x到m的距離,模環長同餘。因此分別從a和x走,必然相交於m節點。

當兩個有環的鍊錶相交時,有以下兩種情況:

在這種情況下,兩個鍊錶的交點在環點之前,可以將環點切斷,這樣就變成了兩個無環的鍊錶求相交點。可使用以上方法。

另一種情況為:

在這種情況下,不存在所謂的相交點。

判斷兩個鍊錶是否相交

思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...

判斷兩個鍊錶是否相交

參考 判斷兩個鍊錶是否相交 假設兩個鍊錶都沒有環 有以下三種方法 1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 2 把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交 3 先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相...

判斷兩個鍊錶是否相交

判斷兩個鍊錶是否相交,程式設計之美 給出了以下方法 1.判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為 o length h1 length h2 這種方法很耗時間 2.利用計數的方法 乙個簡單的做法是對第乙個鍊錶的結點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每...