1、描述
21将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目链接
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
2、关键字
链表,有序,合并
3、思路
1、双指针迭代:构造一个新的,然后一个一个的比较,
2、递归
4、notes
递归3要素
1、终止条件
当其中任一个遍历到最后就结束,把后边的直接加上来
2、递归返回值:
每一层递归都返回排序好的链表头
3、当前层递归操作
如果当前l1的元素小于l2的元素,就把L1->next 接到排序好的递归返回 来的表头相接,且返回当前更新后的表头 。 链表后边大
5、复杂度
两个时间复杂度都是这个:
时间:O(N+M)
空间:O(N+M)
6、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 * res = new ListNode(0); //构造一个哑巴节点
auto dump_head = res;
while(l1 && l2){ // 如果都存在就进到循环里边作比较
if(l1->val < l2->val){ //第一个小
res->next = l1; // 答案链表更新一个元素,并往后移动
res = res->next;
l1=l1->next; // 第一个链表往后移动
}
else{
res->next = l2;
res=res->next;
l2=l2->next;
}
}
if(l1){ // 退出之后哪一个链表还有剩余就把剩下的连接到一起
res->next = l1;
}
if(l2){
res->next = l2;
}
return dump_head->next;
}
};
方法2:递归:
/**
* 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) {
if(!l1) return l2;
if(!l2) return l1;
if(l1->val < l2->val)
{
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else
{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
};