求鍊錶相交節點問題

2021-10-25 15:24:35 字數 1527 閱讀 2786

給定兩個(單向)鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點(引用完全相同),則這兩個鍊錶相交。

輸入:intersectval = 8, lista = [4,1,8,4,5], listb = [5,0,1,8,4,5], skipa = 2, skipb = 3

輸出:reference of the node with value = 8

輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [4,1,8,4,5],鍊錶 b 為 [5,0,1,8,4,5]。在 a 中,相交節點前有 2 個節點;在 b 中,相交節點前有 3 個節點。

雙重迴圈,時間複雜度o(n^2)

如果存在交點,則從交點到鍊錶末尾各個節點都相同,長度相同。因此,可以對暴力法做出相應改進,不用從頭到尾乙個節點乙個節點的判斷。

因為相交點到結尾長度都是一樣,而兩者相交長度小於兩者之間的較短長度 len,所以可以直接從離末尾長len的節點開始判斷。

public listnode getintersectionnode

(listnode heada, listnode headb)

temp = headb;

while

(temp != null)

listnode temp1 =

(len1 > len2 ? heada : headb)

; temp =

(len1 > len2 ? headb : heada)

;for

(int i =

0; i < math.

abs(len1 - len2)

; i++

)for

(int i =

0; i < math.

min(len1, len2)

; i++

)else

}return null;

}

設煉表a的長度為a,鍊錶b的長度為b,a到相交結點的距離為c,b到相交節點的距離為d,顯然可以得到兩者相交鍊錶的長度:a - c = b - d, 變換一下式子得到:a + d = b + c。

我們用乙個指標從鍊錶a出發,到末尾後就從b出發,用另乙個指標從b出發,到末尾後從a出發,由於上面的公式,當前乙個指標走了a+d步數時,後乙個指標走了b+c,兩步數相等,即走到了相交節點。

//tempa要麼是空,要麼是兩鍊錶的交點

return tempa;

}

鍊錶相交問題

1 判斷兩個鍊錶是否相交 假設兩個鍊錶均不帶環 有四種方法 解法1 直觀的想法 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為o length h1 length h2 解法2 利用計數的方法 對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的...

鍊錶相交問題

問題描述 給定兩鍊錶的頭結點,判斷兩鍊錶是否存在公共部分 相交 若相交返回相交的第乙個節點。經分析發現該問題可以分成如下兩個子問題進行解決。子問題一 兩無環鏈表是否相交 演算法一 假設list1長度為l1,list2長度為l2,假設公共部分長為m,由l1 l2 m l2 l1 m可知第一路先遍歷li...

兩鍊錶相交問題

1 兩個鍊錶相交,那麼兩個鍊錶中的節點一定有相同位址。2 兩個鍊錶相交,那麼兩個鍊錶從相交節點開始到尾節點一定都是相同的節點。問 為什麼?答 因為每乙個節點最多只能有乙個下一節點,因此在相交節點之後,鍊錶不可能再分為兩個鍊錶 根據兩個鍊錶是否存在環來分類討論 無環的情況有兩種比較快速的解決方式,這兩...