【 腾讯精选练习 50 题】20—合并K个升序链表【困难】

简介: 【 腾讯精选练习 50 题】20—合并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

题目解析

  • 题目有两种实现方法:最小堆和归并思想
  • 最小堆:
  • 利用 Queue queue = new PriorityQueue<>((v1, v2) -> v1.val - v2.val); 生成一个最小堆
  • 将我们 lists 遍历一遍,放入我们的最小堆中
  • 利用 minListNode = queue.poll()取出最小的,判断其 next 是否为空,从而判断是否添加至 ·queue·
  • 最后返回 newListNode 即可

题目代码

  • 最小堆
public ListNode mergeKLists(ListNode[] lists) {
        // 最小堆的做法
        Queue<ListNode> queue = new PriorityQueue<>((v1, v2) -> v1.val - v2.val);
        for(ListNode listNode : lists){
            if(listNode != null){
                queue.offer(listNode);
            }
        }
        ListNode newNode = new ListNode(0);
        ListNode p1 = newNode;
        while (!queue.isEmpty()){
            ListNode minListNode = queue.poll();
            p1.next = minListNode;
            p1 = p1.next;
            if(minListNode.next != null){
                queue.offer(minListNode.next);
            }
        }
        return newNode;
    }
  • 归并
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        // 类似归并排序
        // 先对于 1 2 、3 4 、5 6
        return merge(lists, 0, lists.length - 1);
    }
    public ListNode merge(ListNode[] lists, int left, int right){
        if(left == right){
            return lists[left];
        }
        if(left > right){
            return null;
        }
        int mid = (right - left) / 2 + left;
        // 获取左边归并的链表
        // 获取右边归并的链表
        ListNode node1 = merge(lists, left, mid);
        ListNode node2 = merge(lists, mid + 1, right);
        // 最后统一进行归并
        return mergeTwoListNode(node1, node2);
    }
  // 两个有序链表的归并
    public ListNode mergeTwoListNode(ListNode node1, ListNode node2){
        if(node1 == null){
            return node2;
        }
        if(node2 == null){
            return node1;
        }
        ListNode newNode = new ListNode(0);
        ListNode p1 = newNode;
        while(node1 != null && node2 != null){
            if(node1.val <= node2.val){
                newNode.next = node1;
                node1 = node1.next;
                newNode = newNode.next;
            }else{
                newNode.next = node2;
                node2 = node2.next;
                newNode = newNode.next;
            }
        }
        while(node1 != null){
            newNode.next = node1;
            node1 = node1.next;
            newNode = newNode.next;
        }
        while(node2 != null){
            newNode.next = node2;
            node2 = node2.next;
            newNode = newNode.next;
        }
        return p1.next;
    }
}


相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
32 0
|
3月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
3月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
19 1
|
3月前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
35 0
|
5月前
|
存储 人工智能 测试技术
每日练习之排序——链表的合并;完全背包—— 兑换零钱
每日练习之排序——链表的合并;完全背包—— 兑换零钱
33 2
|
5月前
|
存储
2.顺序表_链表(附练习)
2.顺序表_链表(附练习)
|
6月前
23. 合并 K 个升序链表
23. 合并 K 个升序链表
55 3
|
5月前
23.合并K个升序链表
23.合并K个升序链表
|
5月前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
6月前
|
索引
【力扣刷题】回文链表、环形链表、合并两个有序链表
【力扣刷题】回文链表、环形链表、合并两个有序链表
39 0