暴力解法當然可以遍歷兩個鍊錶,不過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之前還沒有解,那麼則無解。
/*高階版:因為無解的話最終pa和pb在(m+n)次執行後都會同時指向null,因此當pa==pb時斷開迴圈return即可。這樣可以縮短**長度* * definition for singly-linked list.
* struct listnode
* }; */
class
solution
if(pb==null)
}return
null;}};
/*方法二:* * 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 時間複雜度,且僅...