LeetCode:160.交差連鎖表(JavaScript)


一つのプログラムを作成して、二つのシングルチェーンテーブルが交差する開始ノードを見つけます.
例えば、下の二つのチェーンシート:
A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3
    c1     。
注意:
もし二つのチェーンが交点していないなら、nullに戻ります.結果を返した後、二つのチェーンは元の構造を維持しなければなりません.チェーン構造全体に循環がないと仮定できる.プログラムはO(n)時間の複雑さをできるだけ満たし、O(1)メモリのみを使用します.
考え方
端の角を先に処理する場合:
  • は、一つが空か二つが空いていると、null
  • に戻ります.
  • 両のヘッドノードは等しいので、任意に1
  • に戻ります.
    まず二つのチェーンの長さ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;
    };