1. 程式人生 > >LeetCode: 160.相交連結串列(JavaScript)

LeetCode: 160.相交連結串列(JavaScript)

編寫一個程式,找到兩個單鏈表相交的起始節點。

例如,下面的兩個連結串列:

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; };