LeetCode 23. Merge k Sorted Lists

LeetCode 23. Merge k Sorted Lists (合并K个升序链表)

题目

链接

https://leetcode-cn.com/problems/merge-k-sorted-lists/

问题描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

提示

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

思路

通过最小堆来帮助计算。这里用优先队列,排序node时通过val排序。

首先全部头结点入堆,然后取最小的加入新链表,并且该节点向后并入堆。

复杂度分析

时间复杂度 O(nlogk)
空间复杂度 O(k)

代码

Java

    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) {
            return null;
        }
        ListNode pre = new ListNode();
        ListNode cur = pre;
        PriorityQueue<ListNode> pq = new PriorityQueue<>(
                lists.length, (a, b) -> (a.val - b.val));
        for (ListNode head : lists) {
            if (head != null) {
                pq.add(head);
            }
        }
        while (!pq.isEmpty()) {
            ListNode node = pq.poll();
            cur.next = node;
            if (node.next != null) {
                pq.add(node.next);
            }
            cur = cur.next;
        }
        return pre.next;
    }
posted @ 2022-03-24 14:17  cheng102e  阅读(21)  评论(0编辑  收藏  举报