關於這個問題,有三種思路。
第一種是最普通的思路,使用2層迴圈,第一層迴圈遍歷鍊錶a,在每次遍歷到乙個結點時,第二層迴圈遍歷鍊錶b看看有沒有一樣的結點,這個思路比較容易想,但是這個的思路的時間複雜度比較高,如果兩個鍊錶乙個長度m,乙個長度為n,時間複雜度就是o(mn);
第二種思路需要用到棧,還需要用到單鏈表的特點,單鏈表每乙個結點都只有乙個next結點,所以2個鍊錶相交之後,從第乙個公共節點開始,後面的結點都是相同的。再結合棧先進後出的特點。將2個鍊錶從頭進棧到2個輔助棧裡,然後比較棧頂元素,相同就出棧,最後乙個相同的結點就是第乙個公共結點,這個方法的時間複雜度是o(m+n);
第三種思路,首先遍歷2個鍊錶得到長度,然後相減得到2個鍊錶長度的差值 n ,然後長的鍊錶向前走n步,然後2個鍊錶開始遍歷,找到的第乙個相同的結點就是第乙個公共結點。這種思路很科學所以實現一下這個。
public node islinkcross(linklist list)
}else
}while(p!=q && p.next != null)
}return p;
}
兩個單鏈表第乙個公共結點
基本概念 兩個鍊錶是單鏈表,如果兩個鍊錶有公共節點,那麼這兩個鍊錶從某一節點開始,它們都指向同乙個節點,之後它們所有的節點都是重合的,不可能再出現分叉。所以拓撲形狀看起來是y型。演算法思想 首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個節點。在第二次遍歷的時候,...
兩個單鏈表的第乙個公共節點
題目 求兩個單鏈表的第乙個公共子節點。思路 我們可以先遍歷兩個單鏈表得到長度,然後求得兩個鍊錶長度的差值,然後讓長的那個鍊錶先走到差值長度位置,然後兩個鍊錶再同時遍歷,直到找到第乙個公共節點。struct listnode int getlistlength listnode head return...
兩個單鏈表的第乙個公共結點
方法1 由於是單鏈表,所以可以用乙個set儲存第乙個的節點,然後遍歷第二個鍊錶,尋找相同的節點,時間複雜度o mlogm 空間複雜度o max m,n listnode findfirstcommonnode listnode phead1,listnode phead2 while iter2 r...