php合并2个有序链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

先上代码:
function Merge2($p1, $p2)
{
    if($p1 == null){
        return $p2;
    }
    if($p2 == null){
        return $p1;
    }
    //取较小的为链表的头部
    if($p1->val >= $p2->val){
        $head = $p2;
        //将p2的头部指针后移一位
        $p2 = $p2->next;
    }else{
        $head = $p1;
        $p1 = $p1->next;
    }
    //php中对象的复制,其实就是引用操作,$head和$p其实指向的是同一个内存,所以对$p增加节点同时也会对$head产生影响
    //此操作其实就是将$P的指针指向新链表的头部,此后随着新链表中节点的增加$p的指针也不断的向后移动,但是$head的指针却依然指向链表头部
    $p = $head;
    //循环比较大小
    while($p1 && $p2){
        if($p1->val >= $p2->val){
            //链表增加(将第一个节点的指针指向$p2的第一个节点)
            $p->next = $p2;
            //指针后移
            $p2 = $p2->next;
        }else{
            $p->next = $p1;
            $p1 = $p1->next;
        }
        //工作指针后移
        $p = $p->next;
    }
    //将指针指向链表剩下的部分
    if($p1 == null){
        $p->next = $p2;
    }
    if($p2 == null){
        $p->next = $p1;
    }
    return $head;
}
//测试用例:{1,3,5}, {2,4,6} 如果输出$head为{1,2,3,4,5,6},输出$p为{5,6}

其实,这题解法中的其余地方都挺好理解的,但是有一个地方我一直不太理解,即为什么$p=$head后,用$p去做循环和链表操作,最后却需要输出$head,才能得到正确的解,直到我详细的了解了一下php中对象的赋值之后( http://ymfeb.cn/articles/40)。
在php的深浅复制这篇文章中,我们说了,php类的赋值操作其实就是引用操作,那么当$p=$head后,这两个变量的指针(关于php的变量,查看这篇文章: http://blog.csdn.net/lml200701158/article/details/52235996)其实都指向了新链表的头部,可以用图表示:

在经过了第一次循环后,我们链表的节点发生了改变,而且$p的指针也移动了:

这样到循环完成后:

此时$p1的工作指针已经指向了空,而$p2的工作指针指向了6,所以这时$p2为{6},将其补充到新链表后,新链表就变成了{1,2,3,4,5,6},这时,$p的指针是指向5的,所以
$p最后输出是{5,6},而$head的指针缺始终指向1,所以,最后要输出$head,才能得到完整的链表


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值