兩個連結串列的第一個公共結點

pardon110發表於2020-08-01

問題

輸入兩個連結串列,找出它們的第一個公共結點。

class ListNode{
    var $val;
    var $next = NULL;
    function __construct($x){
        $this->val = $x;
    }
}

分析

  • 兩連結串列長度相等,從頭至尾迴圈同步比較,相同結點跳出
  • 連結串列長度不相等,不計數的情況,通過迴圈達到等長比較效果

兩個連結串列的第一個公共結點
上圖展示了將較長連結串列移動至H11位置,即只要達到兩連結串列最終開始移動的指標與各自末尾距離相等即可

兩個連結串列的第一個公共結點

  1. p1,p2同時從頭部開始。第一輪p1行至尾,此p2所在位置為它比p1多的起始距離。
  2. 將p1 重置切換為源p2的副本從頭部出發,p2指標繼續從第1輪的位置行進
  3. 當p2指標到末,將其指向源p1副本,源p2副本剩下的長度與p1長度相等(p2c -> end == p1c -> end)。

程式碼

function FindFirstCommonNode($pHead1, $pHead2)
{
    $p1 = $pHead1;
    $p2 = $pHead2;
    while($p1 != $p2){
        $p1 = ($p1==NULL) ? $pHead2 : $p1->next;
        $p2 = ($p2==NULL) ? $pHead1 : $p2->next;
    }
    return $p1;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章