「BM10 2 つのリンクされたリストの最初の共通ノード」JavaScript の実装

トピックの説明

2 つの非巡回一方向連結リストを入力し、それらの最初の共通ノードを見つけ、共通ノードがない場合は空を返します。(入力データはリンクされたリストであるため、入力データが正しいことを確認するためにエラー テスト データ プロンプトが別の方法で表示されることに注意してください)

データ範囲: n≤1000
要件: 空間複雑度 O(1)、時間複雑度 O(n)

たとえば、{1,2,3}、{4,5}、{6,7} を入力すると、2 つの非循環一方向連結リストの構造が次の図に示されます。

説明を入力してください:

入力は 3 つのセクションに分割されます。最初のセクションは最初のリンク リストの非公開部分、2 番目のセクションは 2 番目のリンク リストの非公開部分、3 番目のセクションは最初のリンク リストの共通部分です。リストと 2 番目のリンク リスト。バックグラウンドはこれら 3 つのパラメーターを 2 つのリンクされたリストにアセンブルし、2 つのリンクされたリストに対応するヘッド ノードを関数 FindFirstCommonNode に渡します。ユーザーが取得する入力は pHead1 と pHead2 のみです。

戻り値の説明:

渡された pHead1 と pHead2 の最初の共通ノードを返し、このノードをヘッド ノードとするリンク リストがバックグラウンドで出力されます。

例 1:

入力: {1,2,3}、{4,5}、{6,7}

戻り値: {6,7}

説明: 最初のパラメーター {1,2,3} は最初のリンク リストの非公開部分を表し、2 番目のパラメーター {4,5} は 2 番目のリンク リストの非公開部分を表し、最後の {6,最も重要なことは、2 つの連結リストの公開部分の 3 つのパラメーターが最終的にバックグラウンドで 2 つの非循環単一連結リストに組み立てられ、共通のノードがあることです。

例 2:

入力: {1}、{2,3}、{}

戻り値:{}

説明: 2 つのリンクされたリストには共通のノードがなく、null を返し、バックグラウンドで {} を出力します。

問題解決のアイデア

2 つのリンクされたリストをそれぞれ指すように 2 つの AB ポインターを設定し、A と B のポインターは同時に前方に移動し、このリストの最後に移動すると別のリンクされたリストを指し、操作を繰り返します。2 つのポインタの移動ステップが等しく、ステップ長が等しいとすると、交差するノードが存在する場合は、それらに同時に到達し、ループから飛び出し、p1 または p2 に戻ることができます。

コード

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function FindFirstCommonNode(pHead1, pHead2)
{
    //设定两AB指针分别指向两个链表
    let p1 = pHead1;
    let p2 = pHead2;
    if(!p1 || !p2){
        return null
    }
    
    //A,B指针同时向前移动,移动至本列表最末端时指向另一链表重复操作
    while (p1 != p2){
        p1 = (p1 === null ? pHead2: p1.next);
        p2 = (p2 === null ? pHead1: p2.next);
    }
    //相遇即为首个公共节点
    return p1;
    
}
module.exports = {
    FindFirstCommonNode : FindFirstCommonNode
};

おすすめ

転載: blog.csdn.net/qq_42101569/article/details/126476325