将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现思路:
有两种方法:1、递归。
2、依次比较两个链表的值,并将值较小的结点插入新的链表中。
递归实现代码:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1&&list2==NULL) return list1;
else if(list2&&list1==NULL) return list2;
else if(list1==NULL&&list2==NULL) return NULL;
else if(list1->val>list2->val){
list2->next=mergeTwoLists(list1,list2->next);
return list2;
}
else{
list1->next=mergeTwoLists(list1->next,list2);
return list1;
}
}
};
依次加入实现代码:
class Solution {
public:
void attach(int a,ListNode** p1,ListNode** p3){
ListNode* t;
t=(ListNode*)malloc(sizeof(struct ListNode));
t->val=a;
t->next=NULL;
(*p3)->next=t;
(*p3)=t;
(*p1)=(*p1)->next;
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* p;
ListNode* t;
ListNode* t1=list1;
ListNode* t2=list2;
p=(ListNode*)malloc(sizeof(struct ListNode));
p->next=NULL;
ListNode* t3=p;
while(t1&&t2){
if(t1->val<t2->val) attach(t1->val,&t1,&t3);
else if(t1->val>t2->val) attach(t2->val,&t2,&t3);
else{
attach(t1->val,&t1,&t3);
attach(t2->val,&t2,&t3);
}
}
while(t1) attach(t1->val,&t1,&t3);
while(t2) attach(t2->val,&t2,&t3);
t=p;
p=p->next;
free(t);
return p;
}
};
在实现这个法二的过程中,我犯了两个错误。
1、传入attach函数中的两个指针在函数中是要被改变指向的,因此应该用二重指针。
2、attach函数中'>'和'<' 两个符号用反了,这个错就很让人无语。。。。。