給定兩個(單向)鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點(引用完全相同),則這兩個鍊錶相交。
輸入:intersectval = 8, lista = [4,1,8,4,5], listb = [5,0,1,8,4,5], skipa = 2, skipb = 3雙重迴圈,時間複雜度o(n^2)輸出: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 個節點。
如果存在交點,則從交點到鍊錶末尾各個節點都相同,長度相同。因此,可以對暴力法做出相應改進,不用從頭到尾乙個節點乙個節點的判斷。
因為相交點到結尾長度都是一樣,而兩者相交長度小於兩者之間的較短長度 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 兩個鍊錶相交,那麼兩個鍊錶從相交節點開始到尾節點一定都是相同的節點。問 為什麼?答 因為每乙個節點最多只能有乙個下一節點,因此在相交節點之後,鍊錶不可能再分為兩個鍊錶 根據兩個鍊錶是否存在環來分類討論 無環的情況有兩種比較快速的解決方式,這兩...