问题描述:
有k个已经排好序的链表,将其合并为一个有序链表。
代码:
#include <iostream>
#include<stdlib.h>
#include<vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int n=lists.size();
if(n==0) return NULL;//
return helper(lists, 0, n-1);
}
ListNode* helper(vector<ListNode*>& lists, int left, int right)
{//分治法求解(1)divide,(2)conquer,(3)merge
if(left < right)
{
int m=(left+right)/2; //(1)divide
ListNode* h1=helper(lists, left, m); //(2)conquer
ListNode* h2=helper(lists, m+1, right);
return mergeTwoLists(h1, h2); //(3)merge
//return mergeTwoLists(helper(lists, left, m), helper(lists, m+1, right));
}
return lists[left];//left==right的情况!!!!!!
}
//合并两个有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL) return l2;
if(l2==NULL) return l1;
ListNode* head = NULL;
if(l1->val < l2->val)
{
head=l1;
//head=head->next;//FALSE!!!
head->next=mergeTwoLists(l1->next, l2);
}
else
{
head=l2;
//head=head->next; //FALSE!!!
head->next=mergeTwoLists(l1, l2->next);
}
return head;
}
ListNode* CreateList(int a[], int n)
{//头结点包含数据的情况
ListNode *head, *p, *q;
head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
p = head;
p->val = a[0];
//p->next = NULL;
for(int i=1; i<n; i++)
{
q = (ListNode*)malloc(sizeof(ListNode));
q->val = a[i];//数组元素给链表赋值!!!
p->next = q;
p = q;
}
p->next = NULL;//将最后一个结点的指针域清空
return head;//返回这个链表的首地址
}
};
int main()
{
int a[]={1,2,3,4,5};
int a2[]={1,13,15};
int a3[]={2,4,8};
//int a4[]={2,4,8};
Solution s;
ListNode *l1=s.CreateList(a, 5);
ListNode *l2=s.CreateList(a2, 3);
ListNode *l3=s.CreateList(a3, 3);
vector<ListNode*> lists;
lists.push_back(l1);
lists.push_back(l2);
lists.push_back(l3);
//ListNode *p=head->next;
ListNode* head=s.mergeKLists(lists);
ListNode *p=head;
while(p != NULL)
{
cout<<p->val<<endl;
p=p->next;
}
return 0;
}
执行结果:
1
1
2
2
3
4
4
5
8
13
15
Process returned 0 (0x0) execution time : 0.080 s
Press any key to continue.