LeetCode: 160.相交連結串列(JavaScript)
阿新 • • 發佈:2018-11-23
編寫一個程式,找到兩個單鏈表相交的起始節點。
例如,下面的兩個連結串列:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在節點 c1 開始相交。
注意:
如果兩個連結串列沒有交點,返回 null.
在返回結果後,兩個連結串列仍須保持原有的結構。
可假定整個連結串列結構中沒有迴圈。
程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。
思路
先處理邊邊角角的情況:
- 有一條為空或者兩條都為空,則返回null
- 倆頭節點相等,任意返回其一
先算出兩條連結串列的長度 countA,count B,
然後算出差值,讓長的連結串列先走這個差值,保證剩下的節點數與另一條一樣多。
完了之後就同時走倆指標,有相等的就是交點,沒有就返回null。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
let p = headA,
q = headB;
if (!p || !q) return null;
if (p === q) return p;
let countA = 0, countB = 0;
while (p !== null) {
countA ++
p = p.next
}
while (q !== null) {
countB ++
q = q.next
}
p = headA;
q = headB;
if (countA > countB) {
for (let i = countB; i < countA; i++) p = p.next;
} else if (countA < countB) {
for (let i = countA; i < countB; i++) q = q.next;
}
while (p && q) {
if (p === q) return p
p = p.next;
q = q.next;
}
return null;
};