leetcode 160相交鍊錶

2022-04-03 14:28:31 字數 1229 閱讀 8309

暴力解法當然可以遍歷兩個鍊錶,不過time o(mn) space o(1)暫且不說,

方法一:雙指標,

time o(m+n),space o(1)

可以對比判斷環形鍊錶的快慢指標法。

這種方法構思十分十分十分巧妙,假設有兩個鍊錶,鍊錶a:  1 2 3 * #    和鍊錶b:   a b c d e * #  ,可以得出相交的第乙個節點為*。那麼a長度為la=5,*前面有lapre=3個元素;b長度為lb=7,*前面有lbpre=5個元素;可以發現lbpre+la=lapre+lb。

因此,只要用兩個指標,每次前進乙個節點,當pa到達末尾讓其指向headb,當pb到達末尾讓其指向heada那麼當遍歷10次後,兩個指標都剛好到達*處,因此得到結果。

同時,針對無解的情況,記錄兩個鍊錶的長度m和n,並且記錄遍歷次數i如果i>m+n時還沒有滿足條件的節點,可以斷定無解;或者記錄到達null的次數,如果第三次到達null之前還沒有解,那麼則無解。

/*

* * definition for singly-linked list.

* struct listnode

* }; */

class

solution

if(pb==null)

}return

null;}};

高階版:因為無解的話最終pa和pb在(m+n)次執行後都會同時指向null,因此當pa==pb時斷開迴圈return即可。這樣可以縮短**長度

/*

* * definition for singly-linked list.

* struct listnode

* }; */

class

solution

return

pa; }

};

方法二:

使用雜湊表o(n)時間,o(n)空間

/*

* * definition for singly-linked list.

* struct listnode

* }; */

class

solution

while(pb!=null)

return

null;}};

方法三:

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 時間複雜度,且僅...