题解 | #两个链表的第一个公共结点#

两个链表的第一个公共结点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

<?php
/*class ListNode{
    var $val;
    var $next = NULL;
    function __construct($x){
        $this->val = $x;
    }
}*/
function FindFirstCommonNode($pHead1, $pHead2)
{
    if($pHead1 == null || $pHead2 == null){
        return null;
    }
    $len1 = 0;
    $p1 = $pHead1;
    $p11 = $pHead1;
    $p2 = $pHead2;
    $p21 = $pHead2;
    while($p1 != null || $p2 != null){
        if($p1 == null){
            $p21 = $p21->next;
        }else{
            $p1 = $p1->next;
        }
        if($p2 == null){
            $p11 = $p11->next;
        }else{
            $p2 = $p2->next;
        }
    }
    
    while($p11 != null && $p21 != null){
        if($p11 == $p21){
            return $p11;
        }
        $p11 = $p11->next;
        $p21 = $p21->next;
    }
    return null;

}

两个链表的第一个公共节点后一定是一样的,所以可以长的链表先走|len1-len2|步,然后两个链表指针一起移动,判断指针相同就是第一个公共节点。

注意:可以只用一个while来让长的链表多走,短链表指针==null之后,长链表头部指针向后移动1

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务