輸入兩個鍊錶,找出它們的第乙個公共節點。鍊錶定義如下:
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...