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