資料結構與演算法 鍊錶 相交鍊錶 分隔鍊錶

2021-10-10 10:08:00 字數 3143 閱讀 8329

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

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

注意:

如果兩個鍊錶沒有交點,返回 null.

在返回結果後,兩個鍊錶仍須保持原有的結構。

可假定整個鍊錶結構中沒有迴圈。

程式盡量滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。

要是能倒推就簡單了

5的前乙個指標是4

4的前乙個指標是8

8的前乙個指標有兩個:1和1

說明,8是相交結點

問題是,單向鍊錶能找到前乙個結點嗎?

那就涉及到翻轉鍊錶了

正著推

4->1->8->4->5

5->0->1->8->4->5

4跟51跟0

8跟14跟8

5跟5null跟5

都不一樣,兩個鍊錶成了不相交了。這,肯定不對。

兩個鍊錶,找出長度比較短的那個,在前面補-1,使得短的鍊錶長度最後和長的鍊錶長度一樣

-1->4->1->8->4->5

5->0->1->8->4->5

然後,再比較

既然是新新增的-1,肯定跟對應的不相等,可直接略過,從不是新新增的地方開始比較。

也就是,直接比較

4->1->8->4->5

0->1->8->4->5

public

class

solution

//求出鍊錶b的長度

int headblength =0;

while

(currentnodeheadb != null)

//恢復位置

currentnodeheada = heada;

currentnodeheadb = headb;

if(headalength > headblength)

}else

}while

(currentnodeheada != null && currentnodeheadb != null)

else

}return null;

}}

mj是更秀

當判斷a鍊錶的某乙個節點為null的時候,將b鍊錶拼接到a鍊錶的最後面

同理對b

需要注意的是,如果兩個鍊錶不相交,則可能會迴圈呼叫。

public

class

solution

return currentnodeheada;

}}

兩個地方需要注意:

錯誤

currentnodeheada =

(currentnodeheada == null)

? currentnodeheadb: currentnodeheada.next;

currentnodeheadb =

(currentnodeheadb == null)

? currentnodeheada: currentnodeheadb.next;

拼接的時候,需要拼接是原有的heada或headb

錯誤

currentnodeheada =

(currentnodeheada.next == null)

? headb : currentnodeheada.next;

currentnodeheadb =

(currentnodeheadb.next == null)

? heada : currentnodeheadb.next;

使用currentnodeheada.next,當兩個鍊錶不相交的時候,會迴圈呼叫。

86.分隔鍊錶 題目

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

示例:輸入: head = 1->4->3->2->5->2, x = 3

輸出: 1->2->2->4->3->5

如果是分隔成兩部分,則將結果看成是由兩個鍊錶構成,1->2->2 和 4->3->5

然後將兩個鍊錶合成乙個鍊錶

分隔成三部分,就使用三個鍊錶。

使用鍊錶a,找出比3小的結點

使用鍊錶b,找出比3大或等的結點

之後,將b放在a的末尾

需要注意的是,b的結尾需要手動變為null

}//需要注意的地方

rightcurrentnode.next = null;

//拼接

leftcurrentnode.next = rightdummyhead.next;

return leftdummyhead.next;

}}

演算法 鍊錶 鍊錶相交

給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0...

資料結構之鍊錶相交問題

1.先各自求出鍊錶的長度。2.讓長的走長度差步。3.同時走第一次相遇的點就是交點。下面是 public class solution return len public listnode getintersectionnode listnode heada,listnode headb for in...

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,不存...