Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(!l1)
return l2;
if(!l2)
return l1;
ListNode *newHead=new ListNode(0);
ListNode *p=newHead;
while(l1&&l2)
{
if(l1->val<=l2->val)
{
ListNode *newNode=new ListNode(l1->val);
p->next=newNode;
p=newNode;
l1=l1->next;
}
else
{
ListNode *newNode=new ListNode(l2->val);
p->next=newNode;
p=newNode;
l2=l2->next;
}
}
while(l1)
{
ListNode *newNode=new ListNode(l1->val);
p->next=newNode;
p=newNode;
l1=l1->next;
}
while(l2)
{
ListNode *newNode=new ListNode(l2->val);
p->next=newNode;
p=newNode;
l2=l2->next;
}
return newHead->next;
}
Merge
k
sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
在两个链表合并的基础上,运用归并排序的思想
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//这部分不变,两个链表的合并
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(!l1)
return l2;
if(!l2)
return l1;
ListNode *newHead=new ListNode(0);
ListNode *p=newHead;
while(l1&&l2)
{
if(l1->val<=l2->val)
{
ListNode *newNode=new ListNode(l1->val);
p->next=newNode;
p=newNode;
l1=l1->next;
}
else
{
ListNode *newNode=new ListNode(l2->val);
p->next=newNode;
p=newNode;
l2=l2->next;
}
}
while(l1)
{
ListNode *newNode=new ListNode(l1->val);
p->next=newNode;
p=newNode;
l1=l1->next;
}
while(l2)
{
ListNode *newNode=new ListNode(l2->val);
p->next=newNode;
p=newNode;
l2=l2->next;
}
return newHead->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists)
{
int n=lists.size();
if(n==0)
return NULL;
while(n>1)
{
int k=(n+1)/2;
for(int i=0;i<n/2;i++)
{
lists[i]=mergeTwoLists(lists[i],lists[i+k]);
}
n=k;
}
return lists[0];
}