leetcode160相交鍊錶

2021-10-05 03:32:32 字數 1860 閱讀 4737

看到這道題首先想到的是兩個鍊錶相交的部分只可能出現在兩個鍊錶的尾部,接著就自然想到了使用兩個指標來逐個對比listnode的值,就有了接下來的方法:

簡單的想法

由於兩個鍊錶長度不一定一致,而且我們在遍歷一次鍊錶之前沒有辦法知道兩個鍊錶各自的長度,這就導致了我們並能確定從第幾個節點開始進行比較,但是可以明確的是,相交的位置肯定不會是長鍊錶的前k個節點,這裡k = lista.size() - listb.size(),假設a的長度要長於b,而且兩個鍊錶一定會有相交的部分。如果我們知道了這個k值,就可以從長鍊錶的第k個元素,短鍊表的頭部開始進行逐個的比較。當有相等的元素時,便設定這個交點,如果發現了不相等的節點,便將交點設定為null,直到遍歷到列表結尾。這種想法可以用以下**來描述

public

class

solution

while

(pb!=null)

pa = heada;

pb = headb;

// 移動長鍊表指標到指定位置

if(diff >=0)

}else

}// 從當前位置開始比較

while

(pa != null && pb != null)

else

if(pa == pb && result == null)

pa = pa.next;

pb = pb.next;

}return result;

}}

值得注意的是,題目中所說的相交鍊錶並不是指給出兩條鍊錶如

避免上述問題的具體方法是在比較時不去比較兩個指標指向節點的value,而是直接比較兩個指標指向的是否時同乙個節點。

上述的方法是可以解決問題的,但是**是不夠優雅,而且可以看出**冗長的原因是事先對兩個鍊錶的長度差的處理。

優雅的方式

既然兩個鍊錶的長度差帶來了大量的**,那麼有沒有辦法解決這個問題呢?正如開頭就已經說過的,如果兩個鍊錶有相交,那麼二者相交的部分只可能存在於兩個鍊錶的尾巴上。而且解決這個問題的關鍵在於解決兩個鍊錶的長度差。

既然交點存在於尾部,那麼不妨把兩個鍊錶進行拼接,如圖

如圖,我們可以將兩條鍊錶在邏輯上區分開,並將鍊錶a拼接到鍊錶b上,將鍊錶b拼接到鍊錶a上,這樣,新得到的兩條鍊錶長度是完全一樣的(黑色圈住的就是兩條鍊錶的長度差)。而且,相交的部分仍然出現在結尾,同時可以想象,如果兩個指標從頭開始遍歷,如果有交點,那麼當兩個指標第一次指向同乙個節點時,就是我們想要的結果,而如果兩個鍊錶根本沒有共同部分時,兩個指標第一次相等的位置就是null。另外,當兩條鍊錶長度相等時,我們最遠只會遍歷到第一次出現的null,如

1-3-5-null 和 2-4-6-null 還有1-3-5-null和2-4-5-null,也是容易想象的。

邏輯上,我們並不需要真正的將兩條鍊錶真正相接,只需要在遍歷完一條鍊錶時將指標移動到另一條鍊錶的頭部。於是,可以寫出如下**:

public

class

solution

return pa;

}}

在最壞的情況下,只需要對兩個鍊錶都遍歷一次,演算法的時間複雜度為o(m+n),空間複雜度為o(1)

LeetCode160 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅用 o 1 記憶體。解題思路 1.找到兩個鍊錶長度差n後...

Leetcode160 相交鍊錶

解法一 用乙個集合去判斷 class solution sets listnode tmp1 heada listnode tmp2 headb while tmp1 while tmp2 tmp2 tmp2 next return nullptr 解法二 先遍歷一遍兩個鍊錶得到的長度差n,然後讓長...

LeetCode 160 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅...