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