求兩個鍊錶的第乙個公共結點各種情況及三種思路分析

2021-08-01 05:54:51 字數 1875 閱讀 6491

1.尋找兩個鍊錶的第乙個公共結//這道題可以有很多種思路, 我們按照, 有壞到好的順序, 來依次介紹每種思路。  同時, 這種順序,   也是我們面對這道題時,能想到的 由易到難的思路

第一種思路:蠻力法:  簡單粗暴, 蠻力法。  假設有兩個鍊錶 l1 與 l2.  我們拿出 l1 的第乙個結點, 在 l2 中依次遍歷一遍, 遇到數值相同結點, 則返回。    否則 , 拿出 l1 中第二個結點, 重複上述過程, 第乙個返回的結點 即為兩個鍊錶的 第乙個公共結點。

第一種思路的時間複雜度 為 o( m*n ), 空間複雜度 o( 1 ) 假設第乙個鍊錶長度為m, 第二個鍊錶長度為n

第二種思路: 借助外部空間法: 我們先來 研究下 兩個鍊錶 有公共結點意味著什麼, 意味著 這個公共結點為兩個 鍊錶所共有, 又因為(我們題設給出的條件為這個鍊錶為單鏈表, 且結點中 只有兩個資料成員, 乙個為 data, 乙個為指向下乙個結點的指標 next)結點中 只有乙個next成員, 所以, 這個公共結點之後, 兩個鍊錶的所有節點都是一樣的。

即, 如圖, 這兩個鍊錶, 是倒y字形交叉, 而不是 倒x形狀交叉. 所以我們可以 這樣解題, 從鍊錶的尾部開始遍歷, 一直往前, 遇到的最後乙個資料相同的結點 , 即是我們要找的結點。 可是這是單鏈表, 我們沒有指向 prev  的指標, 如何從最後乙個結點往前遍歷呢?

這時我們就要用到棧這種資料結構, 將兩個鍊錶, 分別入 棧s1 和 s2.  入棧結束後, s1 和 s2棧頂相同。 我們 pop 棧s1 和 s2.  pop到最後乙個相等的結點, 即是我們要找的結點

第二種思路 時間複雜度 o( m+n ), 空間複雜度 o( m+n )

和第一種思路相比, 時間複雜度降低, 空間複雜度上公升, 相當於用 空間換時間

第三種思路:不借助外部空間法: 我們再想, 兩個鍊錶 l1 和 l2 , 如果 l1 長度 為 7 ,l2長度為  5.  則, l1 和  l2的公共結點一定在 後五個結點當中。 因為他們從公共結點往後的結點是相同的, 所以 公共結點不可能出現在 l1 的前兩個結點中。

所以我們就可以, 先遍歷一遍 l1 與 l2 得到他們的長度。 假如l1 為 7 . l2 為 5. 則讓 l1先遍歷兩個結點, 接著開始同時遍歷 l1 和 l2. 當它們遇到第乙個資料相等的結點, 就是我們要找的 結點。

第三種思路: 時間複雜度 o( m+n ), 空間複雜度 o( 1 )

和第二種思路相比, 第三種思路, 時間複雜度沒變, 空間複雜度降低 ,是最優的思路。

我們只實現第三種思路, 第二種思路的 另一種實現, 可以參見我寫的 部落格 樹的最近公共祖先2, 使用了第二種思路

#include using namespace std;

template struct listnode

;template size_t getlistlength( listnode* l )

return length;

}template listnode* findfirstcommonnode( listnode* l1, listnode* l2 )

} else }

while ( l1 != l2 ) //第一次寫判斷條件時 我寫的是 l1->_data != l2->_data . 後來想想沒必要那樣寫, 之前的思路分析也有些問題。 判斷條件 直接用 l1 != l2 就好了, 因為 l1 和 l2 第乙個 公共結點 是同乙個結點!

return l1; //注意, 如果兩個鍊錶沒有 公共結點 ,則 我們這裡返回 null.

}

先給出函式的實現**,晚上用 c++ 再寫遍單鏈表後, 我們再通過各種測試用例 來 測試我們函式的 健壯性.

八 求兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。一般的思路是找出兩個鍊錶 長度的差值,然後長的先跑完差值,最後和著短的鍊錶一起跑,這樣必然能夠來到第乙個公共結點 但是這裡有個問題,就是不能夠保證這個鍊錶是無環的,如果有環的話,在判斷鍊錶長度差值的時候,因為一直不能得到null,所以會陷入死迴圈。所以可以先判...

兩個鍊錶的第乙個公共結點

思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...

兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...