找到兩個單鏈表相交的起始節點20201212

2021-10-11 21:40:38 字數 1070 閱讀 6742

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,遍歷鍊錶,如果遍歷完鍊錶,將指標指向另外乙個鍊錶的頭部繼續遍歷,直至兩個指標相遇。...