【Leetcode】之Merge k Sorted Lists

来源:互联网 发布:淘宝评价流程图 编辑:程序博客网 时间:2024/05/16 08:50

一.问题描述

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

二.我的解题思路

之前是做过merge 2 sorted list的题目,所以拿到这个题目,很自然的想法就是采用分治递归法,将原问题转换成多个merfe 2的问题求解。但是结果超时了,这种分治再合并的算法的时间复杂度是O(2n+3n+…+kn)=O(nk²),

接下来就是思考优化。遗憾的是,我自己的思维局限在了如何利用merge 2的结果,最大限度减少merge的耗时上,想了一会没有想到太好的思路。

上网查阅资料,发现别人是用排序问题的思路来解决这个问题。首先取k个链表的头元素,求取最小的元素,将其设为结果链表的头结点。然后维护一个最小堆结构,这种做法的复杂度是O(n*k*logk),测试通过的程序如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */#define LN ListNode*#define HEAP heap.begin(),heap.end()#define PB push_back#define INF 1000000struct node{    int val;    LN from;    node(ListNode* n)    {        if ( n==NULL )        {            val=INF;        }        else        {            val=n->val;        }                   from=n;    }    bool operator<(const node& other)const    {        return val<other.val;    }    bool operator>(const node& other)const    {        return val>other.val;    }};class Solution {public:    ListNode *mergeKLists(vector<ListNode *> &lists) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if (lists.empty()) return NULL;    int n= lists.size();    vector<node> heap;    heap.reserve(n);    for( int i=0;i<n;i++)        heap.PB(node(lists[i]));    make_heap(HEAP,greater<node>());    LN head= new ListNode(0);    LN pL = head;    pop_heap(HEAP,greater<node>());    node small=heap.back();    heap.pop_back();    while(small.val!=INF)    {        LN next=small.from->next;        pL->next=small.from;        small.from->next=NULL;        pL=pL->next;        heap.PB(node(next));        push_heap(HEAP,greater<node>());        pop_heap(HEAP,greater<node>());        small=heap.back();        heap.pop_back();    }    LN ret=head->next;    delete head;    return ret;    }};
0 0
原创粉丝点击