找出兩個鍊錶的第乙個公共節點

2021-07-29 23:19:40 字數 1799 閱讀 6095

輸入兩個鍊錶,找出它們的第乙個公共節點。鍊錶定義如下:

struct listnode ;
方法一:暴力查詢

在第乙個鍊錶上順序遍歷每個節點,每遍歷到乙個節點的時候,在第二個鍊錶上順序遍歷每個節點。如果第二個鍊錶上的節點和第乙個鍊錶上的節點一樣,就說明兩個鍊錶在節點上重合,於是就找到了公共的節點。但這種方法時間複雜度較高,如果鍊錶的長度分別為m和n,時間複雜度達到了o(m*n),並不是很好的解決方法。

方法二:借助外部空間法

首先,經過分析我們發現兩個有公共結點而部分重合的鍊錶,拓撲形狀看起來像乙個y,而不可能像x,如下圖所示,兩個鍊錶在值為6的結點處交匯:

如果兩個鍊錶有公共結點,那麼公共結點出現在兩個鍊錶的尾部。如果我們從兩個鍊錶的尾部開始往前比較,最後乙個相同的結點就是我們要找的結點。but,在單鏈表中只能從頭結點開始按順序遍歷,最後才能到達尾結點。最後到達的尾結點卻要最先被比較,這是「後進先出」的特性。於是,我們可以使用棧的特點來解決這個問題:分別把兩個鍊錶的結點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。在上述思路中,我們需要用兩個輔助棧。如果鍊錶的長度分別為m和n,那麼空間複雜度是o(m+n)。這種思路的時間複雜度是o(m+n)。和最開始的蠻力法相比,時間效率得到了提高,相當於是用空間消耗換取了時間效率。

方法三:不用輔助空間

首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個節點。在第二次遍歷的時候,先在較長的節點上走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的節點就是它們的公共的節點。這種思路的時間複雜度也是o(m+n),空間複雜度為o(1)。空間效率得到提公升。

完整**:

#include

#include

using

namespace

std;

typedef

struct listnode

} *list;

//方法1,暴力

listnode* findfirstcommonnode1(list head1, list head2)

//方法2,借助棧

listnode* findfirstcommonnode2(list head1, list head2)

while(p2)

listnode *common = null;

while(!s1.empty() && !s2.empty()) else

break;

}return common;

}int getlength(list head)

return len;

}//方法3,不用輔助空間

listnode* findfirstcommonnode3(list head1, list head2)

for(int i=0; inext;

while(p_long != null && p_short != null && p_long != p_short)

return p_long;

}int main()

兩個鍊錶第乙個公共節點

先讓長的鍊錶的指標先走長的之差的步數,兩個再一起走,如果相遇就是第乙個公共節點 如果沒交點,就都走到空 struct listnode class solution while pl2 null 復位指標到頭節點 pl1 phead1 pl2 phead2 int dif len 0 if len1...

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

輸入兩個鍊錶,找出它們的第乙個公共的節點。碰到這種題的時候千萬不要用挨個遍歷的方法,時間複雜度高 對於兩個有相同節點的鍊錶的形狀一定是y。而不是x。然後還可能乙個鍊錶長乙個鍊錶短,我們可以求出差值,然後讓長鍊表先走差值的長度,然後在挨個比較就可以了。這樣時間複雜度就小很多了 劍指offer 名企面試...

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

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 先遍歷兩個鍊錶得到它們的長度,求出長鍊錶比短鍊錶多幾個 第二次遍歷,在長鍊表上先走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是它們的第乙個公共結點。public class listnode public listnode find...