演算法 鍊錶 鍊錶相交

2021-10-04 21:48:55 字數 2998 閱讀 6608

給定兩個(單向)鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第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 輸...