假設兩個鏈表分別爲 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的情況一樣。