您的位置:首页 > 编程语言 > C语言/C++

leetcode_c++:链表:Merge k Sorted Lists(023)

2016-07-15 19:49 399 查看
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

//merge k个有序链表成一个

算法

O(nklgk)

归并排序

1. 二分思想

2. 把每个list和与他相邻的链表组合,规模少一半。重复

#include <iostream>
#include <vector>
#include<cmath>
#include <algorithm>

using namespace std;

struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
/*
int ListInsert(ListNode* L, int pos,int data){
int j=1;
ListNode *p,*s;
p=L;
while(p && j<pos){
p=p->next;
++j;
}
if(!p||j>pos)
return 0;
s=new ListNode(0);
s->val=data;
s->next=p->next;
p->next=s;
return 1;
}

// 打印

int ListTraverse(ListNode* L){
ListNode *p=L->next;
while(p){
cout<<p->val<<endl;
p=p->next;
}
printf("\n");
return 1;
}
*/

//leetcode-------------------

class Solution {
public:

ListNode*  merge2Lists(ListNode *l1, ListNode *l2){
ListNode*  dummy=new ListNode(-1);
ListNode*  current=dummy;
while(l1 !=NULL && l2 !=NULL){
if(l1->val<l2->val){
current->next=l1;
l1=l1->next;
}else{
current->next=l2;
l2=l2->next;
}
current=current->next;
}
if(l1!=NULL)
current->next=l1;
else
current->next=l2;

return dummy->next;

}

ListNode* mergeKLists(vector<ListNode*>& lists) {
int sz= lists.size();
if(sz==0)
return NULL;

while(sz>1){
int k=(sz+1)/2;
for(int i=0;i<sz/2;i++)
lists[i]=merge2Lists(lists[i],lists[i+k]);
sz=k;
}

return lists[0];

}
};
//-------------
//---数组数据插入链表----------------

ListNode* createList(int a[],int n){

ListNode* head=NULL,*p=NULL;
for(int i=0;i<n;i++){
if(head==NULL){
head=p=new ListNode(a[i]);
}else{
p->next=new ListNode(a[i]);
p=p->next;
}
}
return  head;
}

void printList(ListNode* h){
while(h!=NULL){
printf("%d ",h->val);
h=h->next;
}
printf("\n");
}

//-------------

int main(){

Solution s;

int a[]={1,3,5,6,7,10};
int b[]={0,4,6,8,11,20,30,40};
ListNode* p1=createList(a,sizeof(a)/sizeof(int));
ListNode* p2=createList(b,sizeof(b)/sizeof(int));

//printList(p1);
//printList(p2);

// printList(s.merge2Lists(p1,p2));

srand(time(0));
vector<ListNode*> v;
for(int i=0;i<50;i++)
v.push_back(new ListNode(random()%100));
//cout<<endl;

printList(s.mergeKLists(v));

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: