将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
思路:
递归,将两个链表的第一个值分别进行比较,将值小的节点递归到下一个节点中。当其中一个链表为空,递归结束。时间和空间复杂度都是m+n,取决于两个链表的长度。
/**
* 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==nullptr){
return l2;
}
else if(l2==nullptr){
return l1;
}
else if(l1->val < l2->val){
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
};
迭代,设一个哑结点和一个工作指针。每次判断l1和l2节点值的大小,将工作指针指向该节点,然后移动工作指针。最后将剩下链表接在后面,注意内存泄漏。
/**
* 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* prehead = new ListNode(-1); //哑节点
ListNode* prev = prehead; //工作指针
while(l1!=nullptr&&l2!=nullptr){ //判断条件
if(l1->val<=l2->val){
prev->next=l1;
l1=l1->next;
}
else{
prev->next=l2;
l2=l2->next;
}
prev=prev->next; //工作指针移动
}
prev->next = l1 != NULL ? l1 : l2; //后接剩下的链表
ListNode* ansNode = prehead->next;
delete prehead; //防止内存泄漏
return ansNode;
}
};