LeetCode23. Merge k Sorted Lists分治法

题意:将k个有序链表归并为1个有序链表。
本题可以用分治来解决,那么应该如何缩小问题规模呢?
问题函数为:

ListNode* mergeKLists(vector<ListNode*>& lists) 

参数为一个链表指针的vector容器,要缩小问题的规模,就要想办法缩小这个容器的规模。
那么我们不妨将lists分成两半,左一半右一半,然后再进行分治,这样问题规模就不断缩小,直到变为处理两个链表。
边界条件有:

  1. lists为空,则返回NULL
  2. lists只有1个链表指针,直接返回该指针
  3. 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值