leetcode系列(40)Merge K Sorted Lists

来源:互联网 发布:观看网络直播人群分析 编辑:程序博客网 时间:2024/04/28 21:17

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

解答:这个题目有两种做法,一个是两两mergeTwoSortedLists,最后返回第一个list;另一种是用堆,但是需要使用priority_queue,并且实现ListNode*的compare的functor。对于第一种做法为什么是两两merge而不是用第一个list去其它的list轮流merge呢?题目中让分析复杂度,两两merge的复杂度是O(2n*(k/2) + 4n*(k/4)... + 2^M*n*(k/2^M)) = O(nk*logk),依次merge的复杂度是:O(2n + 3n + ... + kn) = O(n*k^2)。使用堆的方法是维护了一个k个阶段的最小堆,所以复杂度显而易见就是O(n*k*logk)。

第一种方法的代码如下:

class Solution {public:    ListNode* mergeKLists(vector<ListNode*>& lists) {        int len = lists.size();        if (len <= 0) {            return nullptr;        }                while (len > 1) {            // be aware the difference between (len + 1) / 2 and len / 2            int cur_len = (len + 1) / 2;            for (int i = 0; i < len / 2; i++) {                lists[i] = mergeTwoLists(lists[i], lists[i + cur_len]);            }            len = cur_len;        }        return lists[0];    }private:    ListNode* mergeTwoLists(ListNode* head1, ListNode* head2) {        ListNode* head = nullptr;        if (head1 == nullptr) {            head = head2;        } else if (head2 == nullptr) {            head = head1;        } else {            if (head1->val < head2->val) {                head = head1;                head->next = mergeTwoLists(head1->next, head2);            } else {                head = head2;                head->next = mergeTwoLists(head1, head2->next);            }        }        return head;    }};

第二种方法的代码如下:

class Solution {public:    ListNode* mergeKLists(vector<ListNode*>& lists) {        if (lists.empty()) {            return nullptr;        }        ListNode dummy = ListNode(0);        ListNode* ptr = &dummy;        std::priority_queue<ListNode*, std::deque<ListNode*>, cmp> heap;        for (auto item : lists) {            if (item != nullptr) {                heap.push(item);            }        }        while (heap.empty() == false) {            ListNode* cur = heap.top();            heap.pop();            ptr->next = cur;            ptr = cur;            if (cur->next != nullptr) {                heap.push(cur->next);            }        }        return dummy.next;    }private:    struct cmp {        bool operator() (ListNode* p1, ListNode* p2) {            return p1->val > p2->val; // like std::greater<int>        }    };};





0 0
原创粉丝点击