判斷兩個鍊錶是否相交

2021-07-02 18:01:29 字數 1163 閱讀 6604

給出兩個單行鍊錶的頭指標 判斷這兩個鍊錶是否相交 為了簡化 這裡假設兩個鍊錶均不帶環

方法1:

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

方法2:

如果兩個鍊錶相交 那麼這兩個鍊錶就會有共同的節點 而節點位址又是節點的唯一標識 所以我們能夠判斷兩個鍊錶是否有存在位址一致的節點 就可以判斷兩個鍊錶是否相交

可以對第乙個鍊錶的節點位址進行hash排序 建立hash表 然後對第二個鍊錶的每個節點的位址查詢hash表 如果hash表中有出現該位址 那麼說明有共同節點 

演算法時間複雜度為o(max(lenth(l1)+lenth(l2)))  空間複雜度為o(lenth(l1))

方法3:

兩個鍊錶都是沒有環的 我們可以把第二個鍊錶接在第乙個鍊錶的後面 如果得到的鍊錶有環則說明相交 

判斷是否有環 可以用快慢指標  我們可以從第二個鍊錶的頭指標進行遍歷

方法4:

如果兩個鍊錶相交 則說明這個相交的節點之後所有的節點都是兩個鍊錶所共有(指標指向唯一乙個位址)那麼可以先遍歷第乙個鍊錶 記住最後乙個節點 然後遍歷第二個鍊錶 到最後乙個節點時 和第乙個鍊錶的最後乙個節點比較是否相同 如果相同這說明相交 

時間複雜度為o(max(lenth(l1)+lenth(l2)) 空間複雜度只用了乙個臨時指標儲存鍊錶1的最後乙個指標

求兩個鍊錶的第乙個公共結點:

如果兩個鍊錶有公共結點 那麼公共結點出現在兩個鍊錶的尾部 如果從兩個 鍊錶的尾部開始往前比較最後乙個相同的節點就是相交的節點 但是

在單向鍊錶中只能從頭結點開始順序遍歷 最後才能達到尾結點 最後的尾結點卻要被最先比較 因此可以利用棧的特性 :分別把兩個鍊錶的節點放入兩個棧裡 這樣兩個鍊錶

的尾結點就位於棧頂 接下來比較棧頂的節點是否相同 如果不相同 則把棧頂彈出接著比較下乙個棧 直到找到最後乙個相同的節點

如果兩個鍊錶的長度為別為m.n 那麼空間複雜度和時間複雜度都為o(m+n)

這種方法需要借助兩個輔助棧 

避開使用輔助棧的方法  可以先遍歷兩個鍊錶得到它們的長度 就能知道哪個鍊錶比較長 以及長的鍊錶比短的多幾個結點

在第二次遍歷時 在較長的鍊錶上先走上若干步 接著再同時再兩個鍊錶上遍歷 找到第乙個相同的節點就是第乙個公共結點

這種方法的時間複雜度為o(m+n) 空間複雜度為乙個常量

判斷兩個鍊錶是否相交

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

判斷兩個鍊錶是否相交

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

判斷兩個鍊錶是否相交

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