23. Merge k Sorted Lists

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& 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& 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;
}

你可能感兴趣的:(LeetCode,leetcode,mergeksort,c++实现)