题目链接
https://leetcode-cn.com/problems/merge-two-sorted-lists/
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]示例 2:
输入:l1 = [], l2 = []
输出:[]示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
思路
我们以l1为基础,将l2合并到l1当中。
首先为了方便操作(对于l2头结点小于l1头结点的情况),在l1前面先添加一个虚拟头结点,方便在原本的l1头结点前添加结点,最后输出时删除该虚拟头结点即可。
对于l1中的当前指向的结点和l2中当前指向的结点,如果l2结点的值<l1结点的值,则将该l2结点加入到l1结点之前。具体见代码注释
C++ Code
/**
* 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* l1, ListNode* l2) {
ListNode* vir = new ListNode(-101, l1); ///在l1前添加虚拟头结点方便处理
ListNode* cur1=vir; //cur1指向l1当前遍历的结点
ListNode* cur2=l2; //cur2指向l2当前遍历的结点
ListNode* temp1=cur1; //temp1用于保存cur1的前一结点,初始时和cur1在同一位置
while(cur1!=NULL&&cur2!=NULL) //当cur1和cur2均不为末端结点
{
//cur1当前指向结点的值≥cur2当前指向结点的值 将cur2结点插入到cur1之前
if(cur1->val >= cur2->val)
{
ListNode* temp2=cur2->next; //先用temp保存cur2指向的下一结点 才能对cur2操作
cur2->next=cur1; //将cur2插入到cur1之前
temp1->next=cur2; //连接cur2前面的部分
cur2=temp2; //更新当前cur2 重新指向l2 指向移动前的下一结点
temp1=temp1->next; //更新temp1为cur1的前一结点
}
//cur1当前指向结点的小于cur2当前指向结点的值 cur1往后移
else
{ temp1=cur1;
cur1=cur1->next;
}
}
//if(cur2==NULL) return vir->next;
if(cur1==NULL) //cur1已经走到了末尾,也就是l1已经遍历完了,将l2剩余的元素添加到l1后面
{
temp1->next=cur2;
}
return vir->next; //最开始添加的虚拟头结点要删除
}
};