题意:将k个有序链表归并为1个有序链表。
本题可以用分治来解决,那么应该如何缩小问题规模呢?
问题函数为:
ListNode* mergeKLists(vector<ListNode*>& lists)
参数为一个链表指针的vector容器,要缩小问题的规模,就要想办法缩小这个容器的规模。
那么我们不妨将lists分成两半,左一半右一半,然后再进行分治,这样问题规模就不断缩小,直到变为处理两个链表。
边界条件有:
- lists为空,则返回NULL
- lists只有1个链表指针,直接返回该指针
- lists只有2个链表指针,那么合并这两个链表,并返回合并结果
否则就将lists分成两半,
vector<ListNode*> left(lists.begin(),lists.begin()+lists.size()/2);
vector<ListNode*> right(lists.begin()+lists.size()/2,lists.end());
然后进行递归,这样最终就会回到前面的边界条件中进行处理。
return merge(mergeKLists(left),mergeKLists(right));
合并两个链表是很简单的,不再赘述,下面贴出完整代码
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty()) return NULL;
if(lists.size()==1) return lists[0];
if(lists.size()==2) return merge(lists[0],lists[1]);
vector<ListNode*> left(lists.begin(),lists.begin()+lists.size()/2);
vector<ListNode*> right(lists.begin()+lists.size()/2,lists.end());
return merge(mergeKLists(left),mergeKLists(right));
}
ListNode* merge(ListNode* l1,ListNode* l2){
if(l1==NULL) return l2;
if(l2==NULL) return l1;
ListNode* ans=new ListNode(0);
ListNode* cur=new ListNode(0);
int index=0;
while(l1||l2){
if(!l1){
cur->next=l2;
break;
}
else if(!l2){
cur->next=l1;
break;
}
else if(l1->val<l2->val){
cur->next=new ListNode(l1->val);
cur=cur->next;
l1=l1->next;
}
else{
cur->next=new ListNode(l2->val);
cur=cur->next;
l2=l2->next;
}
if(index==0) ans=cur;
index++;
}
return ans;
}