給定兩個(單向)鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點(引用完全相同),則這兩個鍊錶相交。
示例 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。
注意:1.3.1.1 解題思路
先遍歷乙個鍊錶,每個節點記錄到乙個hashset
再遍歷另乙個鍊錶,每次都去和hashset中的記錄匹配,首次匹配成功的就是相交節點
1.3.1.2 **
public
static listnode getintersectionnode
(listnode heada, listnode headb)
while
(headb!=null)
headb = headb.next;
}return null;
}
1.3.1.3 時間複雜度
o(n)
1.3.1.4 空間複雜度
o(n)
1.3.2.1 解題思路
先分別計算兩個鍊錶長度
然後計算兩個鍊錶長度差異,讓較長的那個先遍歷差值個節點
兩個鍊錶一起遍歷,找到相同物件就是相交節點
1.3.2.2 **
public listnode getintersectionnode
(listnode heada, listnode headb)
if(heada == headb)
// 記錄原始頭節點
listnode newheada = heada;
listnode newheadb = headb;
// 1. 先分別計算兩個鍊錶長度
int lengtha =0;
while
(newheada != null)
int lengthb =0;
while
(newheadb != null)
// 2. 這裡千萬記住重置兩個頭結點
newheada = heada;
newheadb = headb;
// 3. 然後計算兩個鍊錶長度差異,讓較長的那個先遍歷差值個節點
int differ = lengtha - lengthb;
int minlength =0;
if(differ >0)
minlength = lengthb;
}else
minlength = lengtha;
}// 4.兩個鍊錶一起遍歷,找到相同物件就是相交節點
while
(newheada != null)
else
}return null;
}
1.3.2.3 時間複雜度
o(n)
其實是要遍歷兩次
1.3.2.4 空間複雜度
o(1)
1.3.3.1 解題思路
如上圖各自從自己煉表頭結點出發,到達終點後又從另乙個煉表頭結點出發遍歷
如果第二次發生相遇,說明首次相遇節點即是相交節點
否則說明無相交
顯然只要存在焦點,則ac +cd+bc
=bc+cd+ac
,即剛好在相交節點c相遇,否則無相交
1.3.3.2 **
public
static listnode getintersectionnode3
(listnode heada, listnode headb)
if(heada == headb)
// 記錄原始頭節點
listnode newheada = heada;
listnode newheadb = headb;
while
(newheada != newheadb)
else
if(newheadb == null)
else
}// 此時newheada要麼是交點,要麼是不相交時的null
return newheada;
}
1.3.3.2 時間複雜度
o(n)
1.3.3.4 空間複雜度
o(1)
LeetCode 鍊錶 相交鍊錶
語言 python 難度 簡單 描述 找到兩個單鏈表的重合鏈。比如 node a 4,1,8,4,5 node b 5,0,1,8,4,5 則這兩個鍊錶的起始節點為8,重合鏈為 8,4,5 node a 4,1,7,2,1 node b 5,0,1,8,4,5 則這兩個鍊錶的起始節點為null,不存...
Leetcode(鍊錶)相交鍊錶 c
編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅...
資料結構與演算法 鍊錶 相交鍊錶 分隔鍊錶
160.相交鍊錶 編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 例如 輸入 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 輸...