• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

php合并2个有序链表

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

先上代码:
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,才能得到完整的链表



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php批量导出pdf文件的脚本(html-PDf)发布时间:2022-07-10
下一篇:
php截取包含中英文的字符串固定长度发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap