在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 先上代码:
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,才能得到完整的链表
|
2022-08-30
2022-08-17
2022-11-06
2022-08-17
2022-07-18
请发表评论