23. Merge k Sorted Lists

来源:互联网 发布:天命神童 知乎 编辑:程序博客网 时间:2024/06/14 10:17

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

合并k个有序的链表,我们假设每个链表的平均长度是n。

#include "MergeKSortedLists.h"//方法一:两两合并ListNode* MergeKSortedLists::mergeKLists1(vector<ListNode*>& lists){    if (lists.size() == 0) return NULL;    ListNode *res = lists[0];    for (int i = 1; i < lists.size(); i++)    {        //两两合并        res = merge2lists(res, lists[i]);    }    return res;}/*方法二:利用分治的思想把合并k个链表分成两个合并k/2个链表的任务,一直划分,知道任务中只剩一个链表或者两个链表。可以很简单的用递归来实现。因此算法复杂度为T(k) = 2T(k/2) + O(nk),很简单可以推导得到算法复杂度为O(nklogk)*/ListNode* MergeKSortedLists::mergeKLists2(vector<ListNode*>& lists){    int n = lists.size();    if (n == 0) return NULL;    while (n > 1)    {        int k = (n + 1) / 2;        for (int i = 0; i < n / 2; i++)        {            lists[i] = merge2lists(lists[i], lists[i + k]);        }        n = k;    }    return lists[0];}ListNode *MergeKSortedLists::merge2lists(ListNode *head1, ListNode*head2){    ListNode node(0), *res = &node;    while (head1 && head2)    {        if (head1->val <= head2->val)        {            res->next = head1;            head1 = head1->next;        }        else        {            res->next = head2;            head2 = head2->next;        }        res = res->next;    }    if (head1)    {        res->next = head1;    }    else if (head2)    {        res->next = head2;    }    return node.next;}