23.合并k个有序表

Merge k Sorted Lists

问题描述:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

知识补充:

删除vector中的元素

lists.erase(lists.begin()+i);//删除第i个位置的元素,注意此时vector动态改变,即此时i+1位置的元素变为现在的i位置
lists.erase(lists.begin()+i,lists.begin()+j);//删除区间[i,j)的元素

优先级队列

priority_queue<Type, Container, Functional> priQ;//Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
priQ.push();//元素加入队列
priQ.top();//返回队列头部数据
priQ.pop();//队列头部数据出队
priQ.empty();//判断队列是否为空
priQ.size();//返回队列中数据的个数

测试代码:

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int i=0,pos = 0;
        if(lists.empty())
            return NULL;
        while(i<lists.size())
        {
            if(!lists[i])
            {
                lists.erase(lists.begin()+i);
                continue;
            }
            i++;
        }
        ListNode *p=lists[0];
        ListNode dummy(INT_MIN);
        ListNode *tail = &dummy;

        while(!lists.empty())
        {
            i = 0;
            p = lists[0];
            pos = 0;
            while(i<lists.size())
            {


                if(lists[i]->val<p->val)
                {
                    p = lists[i];
                    pos = i;
                }
                i++;
            }
            tail->next = p;
            tail = tail->next;
            if(p->next)
            {
                p = p->next;
                lists[pos] = p;
            }else
            {
                lists.erase(lists.begin()+pos);
            }
        }

        return dummy.next;

}

性能:

这里写图片描述

参考答案:

class Solution {
public:
    // Need to use > because we want priority queue to return the min priority first
    struct priQueueCmp {
        bool operator() (const ListNode* l, const ListNode* r) {
            return l->val > r->val;
        }
    };

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // Using priority queue to pick out min of the lists at each step.
        // Pri queue picks out the min in const time, but insertion and deletion takes
        // log time
        priority_queue<ListNode*, vector<ListNode*>, priQueueCmp> priQ;

        ListNode* head = NULL;
        ListNode* lastNode = NULL;
        // load up 
        for(int i = 0; i < lists.size(); ++i) {
            if(lists[i] != NULL)
                priQ.push(lists[i]);
        }

        if(priQ.empty())
            return head;

        head = priQ.top();
        lastNode = head;
        priQ.pop();
        if(head->next != NULL)
            priQ.push(head->next);

        while(!priQ.empty())
        {
            ListNode* minNode = priQ.top();
            lastNode->next = minNode;
            lastNode = minNode;
            priQ.pop();
            if(minNode->next != NULL)
                priQ.push(minNode->next);

        }

        return head;
    }
};

性能:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值