23合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-k-sorted-lists 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Solution 1

使用优先队列合并(递归版)
执行用时:580 ms
内存消耗:7.9 MB
找lists的头节点中最小的一个的环节可以优化

struct ListNode *mergeKLists(struct ListNode **lists, int listsSize)
{
    struct ListNode *node;
    int n = 0, i = 0;
    while (n < listsSize)
    {
        if (lists[n] != NULL)
            break;
        else
            n++;
    }
    if (n == listsSize)
        return NULL;
    for (i = 0; i < listsSize; i++)
    {
        if (lists[i] != NULL && lists[n]->val > lists[i]->val)
            n = i;
    }
    node = lists[n];
    lists[n] = lists[n]->next;
    node->next = mergeKLists(lists, listsSize);
    return node;
}

Solution 2

使用优先队列合并(非递归版)
执行用时:552 ms
内存消耗:7.9 MB
找lists的头节点中最小的一个的环节可以优化

struct ListNode *mergeKLists(struct ListNode **lists, int listsSize)
{
    struct ListNode _head;
    struct ListNode *head = &_head;
    struct ListNode *node = head;
    int n = 0, i = 0;
    _head.next = NULL;
    while (1)
    {
        for (n = 0; n < listsSize; n++)
            if (lists[n] != NULL)
                break;
        if (n == listsSize)
            break;
        for (i = 0; i < listsSize; i++)
        {
            if (lists[i] != NULL && lists[n]->val > lists[i]->val)
                n = i;
        }
        node->next = lists[n];
        node = node->next;
        lists[n] = lists[n]->next;
    }
    return head->next;
}