题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
数据范围:链表长度 [0,500]。
**样例**
输入:1->3->5 , 2->4->5
输出:1->2->3->4->5->5
算法一:二路归并 O(n)
新建一个链表,将l1和l2归并在新链表中。
//两个链表各遍历一次,所以时间复杂度为O(n)
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
if(l1 == nullptr) return l2;
if(l2 == nullptr) return l1;
ListNode* res = new ListNode(0);
ListNode* p = res;
while (l1!=nullptr && l2!=nullptr)
{
if (l1->val < l2->val)
{
p->next = l1;
l1 = l1->next;
}
else
{
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
p->next = (l1!=nullptr ? l1 : l2);//将l1或l2剩余的结点串接到新链表中
delete res;//不知道是否正确
return res->next;
}
};
算法二:递归
//O(n)
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
if(l1==nullptr)return l2;//其中一个为空则直接返回另一个链表
if(l2==nullptr)return l1;
ListNode* res = dfs(l1,l2);
return res;
}
ListNode* dfs(ListNode* l1,ListNode* l2){
if(l1==nullptr)return l2;
if(l2==nullptr)return l1;
ListNode* temp=nullptr;
if(l1->val<l2->val)
{
temp=l1;
temp->next=dfs(l1->next,l2);
}
else
{
temp=l2;
temp->next=dfs(l1,l2->next);
}
return temp;
}
};