輸入兩個鍊錶,找出它們的第乙個公共結點。
公共節點指的是節點的指標相同(節點本身相同),而不是節點的內容相同。
如果考慮暴力的方法,對於鍊錶1的每個元素,去遍歷鍊錶2,找出第乙個公共節點,這樣時間複雜度為o(mn),計算開銷大;(m,n分別為兩個鍊錶的長度)
考慮具有公共節點的鍊錶的特徵:如果兩個鍊錶有公共節點,則兩個鍊錶會形成「y」的形狀,在公共節點後,兩個鍊錶是相同的。
(1)這時候我們可以考慮在遍歷的時候用兩個棧去存在兩個鍊錶的元素,然後依次對兩個棧進行彈棧操作,最後乙個相同的元素即是第乙個公共節點;
該方法時間複雜度為o(m+n);空間複雜度也是o(m+n)
(1)考慮效率更高的方法。我們先通過一次遍歷得到兩個鍊錶的長度len1和len2。假設len1>len2,重新遍歷兩個鍊錶時,讓鍊錶1先走len1-len2步,這樣兩個鍊錶的剩餘長度相同。然後同時開始遍歷,找出公共節點。
時間複雜度為o(m+n),且不需要額外的空間開銷。
/*
struct listnode
};*/
class
solution
while
(pnode2!=
nullptr
) pnode1 = phead1;
pnode2 = phead2;
int i =0;
// 讓較長鍊錶先走一段距離;使兩個鍊錶剩餘長度相等
if(len1>len2)
}else
if(len1}while
(pnode1!=
nullptr
&& pnode2!=
nullptr
)return
nullptr;}
};
劍指offer 兩個鍊錶第乙個公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。解題思路 用兩重迴圈,對第乙個鍊錶的每乙個結點都進行第二個鍊錶所有結點的遍歷,若發現結點相等,則將結點返回 public listnode findfirstcommonnode listnode phead1,listnode phead2 phe...
劍指offer 兩個鍊錶的第乙個公共節點
題目延伸 程式設計之美中的求兩個節點是否相交 將兩個節點串在一起,若有節點,串在一起的節點就會出現環,利用一二不長不等,兩個節點在環中必然相遇。本題描述 輸入兩個鍊錶,找出它們的第乙個公共結點。分析 乙個簡單的方法是 首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾...
劍指offer 兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。由於是單鏈表,所以可以發現從第乙個公共節點開始,後面的結點都是相同的,一種思路是從兩個鍊錶的尾部開始遍歷,直到發現最後乙個相同的結點為止,那麼這最後乙個相同的結點是單鏈表的角度看就是兩個鍊錶的第乙個公共節點了。還有一種思路是不需要從尾部開始遍歷,畢竟從尾部遍歷...