分治法,两两合并
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergetwolist(struct ListNode*s,struct ListNode *t){
struct ListNode*n=malloc(sizeof(*n));
n->val=0;n->next=NULL;
struct ListNode*ret=n;
while(s&&t){
if(s->val>t->val){
n->next=t;
t=t->next;
}
else{
n->next=s;
s=s->next;
}
n=n->next;
}
if(s){
n->next=s;
}
if(t){
n->next=t;
}
return ret->next;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
if(listsSize==0)return NULL;
struct ListNode*ret;
merge(lists,0,listsSize-1);
return lists[0];
}
void merge(struct ListNode** lists,int start,int end){
while(start<end){
lists[start]=mergetwolist(lists[start],lists[end]);
start++;end--;
}
if(end<=0)return;
merge(lists,0,end);
return;
}