将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
样例:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = [] 输出:[]
输入:l1 = [], l2 = [0] 输出:[0]
使用双指针思想解题
图示为: 1.创建链表及指针
2.比较数值大小,把较小的节点
加到已排序的链表
中
3.将p1指针向后移动
4.将p3移动到已排序链表
的最后一个节点
5.同步骤2
6.同步骤3
7.同步骤4
循环执行,直到一方指针为空
跳出循环
将非空指针指向的节点
加到已排序的链表
里,此时返回ptmp->next
即为合并后的链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* p3=new ListNode(0);
ListNode* ptmp=p3;
while(list1 && list2)
{
if(list1->val < list2->val)
{
p3->next=list1;
list1=list1->next;
}
else
{
p3->next=list2;
list2=list2->next;
}
p3=p3->next;
}
if(list1)
p3->next=list1;
else
p3->next=list2;
return ptmp->next;
}
};
注意每一步的执行顺序:将较小节点加入链表
->将原链表指针向后移动
->将新链表指针向后移动
当循环结束后,把原链表非空指针指向的节点
加到已排序的链表中即可,返回虚拟头结点的next节点
,即可得到合并后的有序链表
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有