class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==nullptr)return l2;
if(l2==nullptr)return l1;
ListNode* head1=l1,*tmp=nullptr;
if(l1->val>l2->val){
head1=l2;
while(l2->next&&(l2->next)->val<=l1->val) l2=l2->next;
tmp=l2->next;
l2->next=l1;
l2=tmp;
}
while(l1->next&&l2){
if(l2->val>(l1->next)->val) l1=l1->next;
else{
tmp=l1->next;
l1->next=l2;
l1=tmp;
while(l2->next&&(l2->next)->val<=l1->val) l2=l2->next;
tmp=l2->next;
l2->next=l1;
l2=tmp;
}
}
if(l2)l1->next=l2;
return head1;
}
};
纪念第一次one-take(喜
这题随便什么算法的时间复杂度都是O(M+N),比较时间莫得意义,要下功夫无非是尽量减少空间复杂度和多开脑洞多想点方法。
本解法将l2放进l1中,分为放在l1前面,放在l2内部,放在l1后面三段,没有什么递归。