leetcode算法练习——合并k个排序链表

题目:

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

示例:

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

分析:
将k个链表分组,两个一组,并将同一组的链表合并;完成后 k k 个链表被合并成了 k 2 \frac{k}{2} 个,重复这个过程,直到合并为1个链表。
时间复杂度 O ( N l o g k ) O(Nlogk) N N 为链表元素和
空间复杂度 O ( 1 ) O(1)

代码如下:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
    {
        if (l1 == NULL) return l2;
        if (l2 == NULL) return l1;
        ListNode* fir = new ListNode(0);
        ListNode* sec = fir;
        while (l1 != NULL && l2 != NULL)
        {
            if (l1->val <= l2->val) {
                sec->next = l1;
                l1 = l1->next;
            }
            else {
                sec->next = l2;
                l2 = l2->next;
            }
            sec = sec->next;
        }
        if (l1 == NULL)
        {
            sec->next = l2;
        }
        else
        {
            sec->next = l1;
        }
        return fir->next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists)
    {
        int len = lists.size();
        if (len == 0) return NULL;
        int num = 1;
        while (num < len)
        {
            for (int i = 0; i < len - num; i += 2 * num)
            {
                lists[i] = mergeTwoLists(lists[i], lists[i + num]);
            }
            num *= 2;
        }
        return lists[0];
    }
};

运行结果:

在这里插入图片描述

发布了102 篇原创文章 · 获赞 6 · 访问量 2041

猜你喜欢

转载自blog.csdn.net/qq_44957388/article/details/104829854