【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表

简介: 【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表

题目

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

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

示例 1:

输入: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

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • 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

通过次数

766.6K

提交次数

1.3M

通过率

59.1%

思路

  • 优先队列
  • Lambda表达式
  • 最小堆、最大堆

解答

//给你一个链表数组,每个链表都已经按升序排列。 
//
// 请你将所有链表合并到一个升序链表中,返回合并后的链表。 
//
// 
//
// 示例 1: 
//
// 输入: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
// 
//
// 示例 2: 
//
// 输入:lists = []
//输出:[]
// 
//
// 示例 3: 
//
// 输入:lists = [[]]
//输出:[]
// 
//
// 
//
// 提示: 
//
// 
// 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 
// 
//
// Related Topics 链表 分治 堆(优先队列) 归并排序 👍 2772 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
import java.util.List;
import java.util.PriorityQueue;
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length==0) return null;
        //虚拟头节点
        ListNode dummy=new ListNode();
        ListNode p=dummy;
        //优先级队列--最小堆
        PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(
                lists.length,(a,b)->(a.val-b.val)
        );
        //将k个链表的头节点加入最小堆
        for (ListNode head :lists) {
            if (head != null)
                pq.add(head);
        }
            while (!pq.isEmpty()) {
                //获取最小节点,接到结果链表中
                ListNode node = pq.poll();
                p.next = node;
                if (node.next != null) {
                    pq.add(node.next);
                }
                p = p.next;
            }
        return dummy.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)


目录
相关文章
|
5月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
1天前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
5 0
|
5月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
34 1
|
5月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
5月前
牛客网-合并两个排序的链表
牛客网-合并两个排序的链表
33 0
剑指offer 24. 合并两个排序的链表
剑指offer 24. 合并两个排序的链表
88 0
|
人工智能 算法 BI
算法每日一题(合并两个有序的数组)
算法每日一题(合并两个有序的数组)
112 0
算法每日一题(合并两个有序的数组)
|
算法 前端开发
每日两题 - 合并K个升序链表 + 删除有序数组的重复项 🏆
每日两题 - 合并K个升序链表 + 删除有序数组的重复项 🏆
107 0
每日两题 - 合并K个升序链表 + 删除有序数组的重复项 🏆
【刷题记录】21. 合并两个有序链表
【刷题记录】21. 合并两个有序链表
147 0
【刷题记录】21. 合并两个有序链表
|
算法
【刷算法】合并两个排序的单链表
【刷算法】合并两个排序的单链表