一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
二、测试用例
示例 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 用于遍历两个链表;指针 ans 用于存放答案;指针 head 用于遍历答案;
- 合并排序:遍历两个链表,
- 如果 l1 的值小于 l2 :表示要存的结点是 l1 ,将 l1 存到 head 的下一个结点中,l1 后移;
- 如果 l1 的值大于等于 l2 :表示要存的结点是 q ,表示要存的结点是 l2 ,将 l2 存到 head 的下一个结点中,l2 后移;
- head 后移
- 将最后剩余的非空链表拼接到 head 的下一个结点中。
- 释放头指针的空间并返回结果 ans 。【头结点表示头指针,不存入任何值,而结果不要头指针】
四、参考代码
时间复杂度:
O
(
n
)
\Omicron(n)
O(n)
空间复杂度:
O
(
1
)
\Omicron(1)
O(1)
/**
* 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 *ans=new ListNode(),*head=ans,*l1=list1,*l2=list2;
while(l1!=nullptr&&l2!=nullptr){
if(l1->val<l2->val){
head->next=l1;
l1=l1->next;
}else{
head->next=l2;
l2=l2->next;
}
head=head->next;
}
head->next=(l1!=nullptr)?l1:l2;
head=ans;
ans=ans->next;
delete head;
return ans;
}
};