23. Merge k Sorted Lists

来源:互联网 发布:如何开淘宝话费充值店 编辑:程序博客网 时间:2024/04/27 17:40

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

解法一:依次合并两个,直至把所有的合并完。

 ListNode* mergeKLists(vector<ListNode*>& lists) {        int n=lists.size();        if(n==0) return NULL;        while(lists.size()>=2)        {            lists.push_back(merge2lists(lists[0],lists[1]));            lists.erase(lists.begin());            lists.erase(lists.begin());        }            return lists[0];    }    ListNode* merge2lists(ListNode* a,ListNode* b)//合并2个    {        if(a==NULL) return b;        if(b==NULL) return a;        ListNode* l=new ListNode(0),*p;        p=l;        while(a&&b)        {            if(a->val<b->val)            {            l->next=a;            a=a->next;            }            else            {                l->next=b;                b=b->next;            }            l=l->next;        }        if(a)        l->next=a;        if(b)        l->next=b;        return p->next;    }
解法二:

运用优先队列,每次找到的都是当前所有节点中的最小节点。

 

  struct com{  bool operator()( ListNode* &t1, ListNode* &t2)//优先队列比较函数的重载    {               return t1->val > t2->val;    }};

ListNode* mergeKLists(vector<ListNode*>& lists) {        priority_queue<ListNode*,vector<ListNode*>,com> pq;        int n=lists.size();        for(int i=0;i<n;i++)        if(lists[i]) pq.push(lists[i]);        ListNode* l=new ListNode(0),*p=l;        while(pq.size()>0)        {            l->next=pq.top();            pq.pop();            l=l->next;            if(l->next)            pq.push(l->next);        }        return p->next;    }



0 0
原创粉丝点击