2.解法: 鍊錶相加 1ms 41.4mb
編寫乙個程式,找到兩個單鏈表相交的起始節點。
注意:
* 如果兩個鍊錶沒有交點,返回 null.
* 在返回結果後,兩個鍊錶仍須保持原有的結構。
* 可假定整個鍊錶結構中沒有迴圈。
* 程式盡量滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。
相交的概念,不是兩條直線相交與乙個焦點;而是因為鍊錶帶有next指標,所以一旦有乙個焦點,那麼往後的節點都是指向同乙個節點。
因此,如果兩個鍊錶長度相等,那麼直接往後遍歷,如果有相等的node節點,那麼一定會相交;否則不想交;
如果兩個鍊錶長度不相等,那麼需要消除長短鍊錶的長度差再同時往後遍歷即可;
所以此題的關鍵在於,如何消長短鍊錶的長度差?
或許可以這麼做:
分別遍歷兩個鍊錶,統計鍊錶長度,找到長度差k,然後長鍊表先走k步,之後短鍊表與之同行再判斷。這種做法沒問題,相對來講比較複雜。
比較高階一點的做法就是長短鍊錶相加消除長度差。
如下圖所示:
長鍊表a長度為5,短鍊表b長度為4;可以把兩個鍊錶拼接長乙個鍊錶,只是順序不同;
那麼兩個相同長度的鍊錶,同時往後遍歷節點,那麼一定會走到相交的節點。
public listnode getintersectionnode
(listnode heada, listnode headb)
return nodea;
}
如果看懂分析部分,那麼**理解不難。
這裡注意,nodea遍歷到heada鍊錶的末尾,那麼nodea會指向headb,從而繼續走nodea.next。
編寫乙個程式,找到兩個單鏈表相交的起始節點。
1.問題描述 有兩個鍊錶相交,找到相交的結點。比如以上兩個鍊錶,相交的起始節點是c1 2.問題分析 兩個鍊錶肯定有乙個長,乙個短,使用兩個引用,把兩個鍊錶的長度相減,假設長度為diff,讓長鍊錶的引用先走diff步,之後當長鍊錶的引用不等於短鍊表的引用時,兩個引用都各走一步,當它們第一次相等時,找到...
找到兩個單鏈表相交的起始節點(乙個浪漫的解法)
編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。輸入 intersectval 8,lista 4 1,8 4,5 listb 5 0,1 8,4 5 skipa 2,skipb 3輸出 reference of the node with value 8輸入解...
教你用浪漫的方式找到兩個單鏈表相交的起始節點
pipi的奇思妙想 你以為我打算講演算法,其實我準備講愛情 故事的開始,是一道演算法題 題目 想見你浪漫的愛情故事之如何找到兩個單鏈表相交的起始節點 解釋 一種比較巧妙的方式是,分別為鍊錶a和鍊錶b設定指標a和指標b,遍歷鍊錶,如果遍歷完鍊錶,將指標指向另外乙個鍊錶的頭部繼續遍歷,直至兩個指標相遇。...