編寫乙個程式,找到兩個單鏈表相交的起始節點。解法一:遍歷鍊錶記錄長度。例如,下面的兩個鍊錶:
a: a1 → a2
c1 → c2 → c3
b: b1 → b2 → b3
在節點 c1 開始相交。
注意: 如果兩個鍊錶沒有交點,返回 null.
在返回結果後,兩個鍊錶仍須保持原有的結構。
可假定整個鍊錶結構中沒有迴圈。
程式盡量滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。
同時遍歷兩個鍊錶到尾部,同時記錄兩個鍊錶的長度。若兩個鍊錶最後的乙個節點相同,則兩個鍊錶相交。
有兩個鍊錶的長度後,我們就可以知道哪個鍊錶長,設較長的鍊錶長度為len1,短的鍊錶長度為len2。
則先讓較長的鍊錶向後移動(len1-len2)個長度。然後開始從當前位置同時遍歷兩個鍊錶,當遍歷到的鍊錶的節點相同時,則這個節點就是第乙個相交的節點。
**實現:
public int countlength(listnode head)
return length;
}public listnode getintersectionnode(listnode heada, listnode headb)
return a;}}
解法三:棧
我們可以從頭遍歷兩個鍊錶。建立兩個棧,第乙個棧儲存第乙個鍊錶的節點,第二個棧儲存第二個鍊錶的節點,直至鍊錶的所有節點入棧,通過取兩個棧的棧頂元素節點判斷是否相等即可判斷兩個鍊錶是否相交。從第乙個相交節點之後,後續節點均相交直至鍊錶結束。出棧直至兩個節點不相同時,則這個節點的後乙個節點是第乙個相交節點。
**實現:
public listnode getintersectionnode(listnode heada, listnode headb)
}return insecnode;
}//鍊錶的入棧方法
public stack pushstack(listnode head)
return stack;
}
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 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。注意 如果兩個鍊錶沒有交點,返回 null。在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅用 o 1 記憶體。用兩個指標在兩個鍊錶中分別遍歷,有相同的則輸出 因為只遍歷了一遍,所以時間複雜度為...