劍指offer第52題 兩個鍊錶的第乙個公共節點

2021-10-25 07:59:51 字數 2110 閱讀 1468

輸入兩個鍊錶,找出它們的第乙個公共節點。

如下面的兩個鍊錶:

在節點 c1 開始相交。

示例 1:

輸入: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 個節點。

示例 2:

輸入:intersectval =

2, lista =[0

,9,1

,2,4

], listb =[3

,2,4

], skipa =

3, skipb =

1輸出:reference of the node with value =

2輸入解釋:相交節點的值為 2 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [0,

9,1,

2,4],鍊錶 b 為 [3,

2,4]。在 a 中,相交節點前有 3 個節點;在 b 中,相交節點前有 1 個節點。

示例 3:

輸入:intersectval =

0, lista =[2

,6,4

], listb =[1

,5], skipa =

3, skipb =

2輸出:null

輸入解釋:從各自的表頭開始算起,鍊錶 a 為 [2,

6,4],鍊錶 b 為 [1,

5]。由於這兩個鍊錶不相交,所以 intersectval 必須為 0,而 skipa 和 skipb 可以是任意值。

解釋:這兩個鍊錶不相交,因此返回 null。

注意:

我們使用兩個指標node1,node2分別指向兩個鍊錶heada, headb的頭結點,然後同時分別逐結點遍歷,當nodel到達鍊錶heada的末尾時,重新定位到鍊錶headb的頭結點;當node2到達鍊錶headb的末尾時,重新定位到鍊錶heada的頭結點。

這樣,當它們相遇時,所指向的結點就是第乙個公共結點。因為這時兩個指標走過的節點數都是相同的。

這兩個指標行為就是《你的名字》裡的劇情:

你變成我,走過我走過的路。

我變成你,走過你走過的路。

然後我們便相遇了.

.

public listnode getintersectionnode

(listnode heada, listnode headb)

return node1;

}

注意:**中的迴圈並不會出現死迴圈,因為當兩個指標走完兩條鍊錶時(兩條鍊錶的長度之和是不變的,他們一定會同時走完),他們就會同時指向null,這時會結束迴圈。提交結果:

劍指offer 合併兩個鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。新建乙個節點作為head,依次遍歷兩個陣列 時間複雜度 o n 空間複雜度 o 1 coding utf 8 class listnode def init self,x self.val x self.ne...

劍指Offer 合併兩個排序鍊錶

題目 輸入兩個遞增排序的鍊錶,合併兩個鍊錶並使新鍊錶依然是有序的 鍊錶定義如下 typedef struct listnode linklist 例子如下 首先考慮輸入特殊情況。我們假設輸入鍊錶如果不為空的話必然有序,也就是說不用判斷其有序性。當輸入鍊錶都為空指標,此時返回的鍊錶也需要為空指標。如果...

劍指offer 合併兩個有序鍊錶

依次比較兩個鍊錶的首結點,取較小的的結點放到第三個鍊錶尾,同時移動較小節點所在鍊錶的指標指向下乙個節點。步驟一結果會有乙個鍊錶先遍歷結束 第三個鍊錶尾結點指向剩餘未遍歷結束的鍊錶 返回第三個鍊錶首結點 struct listnode class solution else merlist merli...