兩個單向鏈表,存在同一個元素,求其交點

假設兩個鏈表分別爲 a 、b , 長度分別爲 m 、n


這個題目最首先想到的可能是: 

先循環遍歷其中鏈表a,然後在該循環中遍歷鏈表b,然後判斷兩個鏈表的節點是否相同, 假設a的長度爲m,b的長度爲n, 那麼該算法的複雜度爲O(mn)  這並不是一個高效的辦法


分析:

思考一下單鏈表的特性  :每個節點都有且僅有一個子節點。

兩個單鏈表擁有同一個元素,也就是說這個同一個元素的子元素是一樣的,那麼他們後面的節點都是一致的,可以確定的是尾節點一定是一樣的,這兩個單鏈表就像  Y 一樣。 現在要確定的是第一個一樣的節點(也就是交點)的位置


若m=n,即長度相等, 那麼我們只需要同時遍歷兩個鏈表,然後判斷是否相等即可:

while (a.next != null && b.next != null) {

curA = a.next;

curB = b.next;

if(curA  == curB) {

//當前位置即爲交點

}

}

若m!=n, 兩個鏈表長度不相等, 我們分析知道他們重疊的部分一定是在鏈表的後端,而兩個鏈表長度不一致,假設a比b長,那麼a的前面多出的元素不可能會存在交點的,那麼我們可以得到兩個鏈表的個數差爲 m-n,先從a鏈表中遍歷 m-n個元素 ,然後接下來同時遍歷a 和b 鏈表, 和 m=n的情況一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章