BM5 合并k个已排序的链表

BM5 合并k个已排序的链表

描述

合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

数据范围:节点总数 0≤n≤5000,每个节点的val满足 ∣val∣<=1000

要求:时间复杂度 O(nlogn)

示例1

输入: {1,2,3},{4,5,6,7}

返回值:{1,2,3,4,5,6,7}
示例2

输入:{1,2},{1,4,5},{6}

返回值:{1,1,2,4,5,6}

代码

java 复制代码
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

(一)分治方法

1、从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n/2个链表和右边n/2个链表。

2、继续不断递归划分,直到每部分链表数为1.

3、将划分好的相邻两部分链表,按照两个有序链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表。

【用到了递归的思想】

java 复制代码
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param lists ListNode类ArrayList 
     * @return ListNode类
     */
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        return mergeAll(lists,0,lists.size()-1);
    }

    public ListNode mergeAll(ArrayList<ListNode> lists,int left,int right){
        if(left<right){
            int mid = (left+right)/2;
            return merge(mergeAll(lists,left,mid),mergeAll(lists,mid+1,right));
        }else if(left==right){
            return lists.get(left);
        }else{
            return null;
        }
    }

    public ListNode merge(ListNode node1,ListNode node2){
        if(node1==null) return node2;
        if(node2==null) return node1;
        ListNode head;
        if(node1.val<=node2.val){
            head = node1;
            node1=node1.next;
        }else{
            head = node2;
            node2=node2.next;
        }
        ListNode result = head;
        while(node1!=null && node2!=null){
            if(node1.val<=node2.val){
                head.next=node1;
                node1 = node1.next;
                head = head.next;
            }else{
                head.next=node2;
                node2 = node2.next;
                head = head.next;
            }
        }
        if(node1!=null){
            head.next=node1;
        }
        if(node2!=null){
            head.next=node2;
        }
        return result;
    }
}

(二)

创建小顶堆

java 复制代码
PriorityQueue<Integer> minHeap = new PriorityQueue<>();

自定义元素的优先级

java 复制代码
PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> a - b);

在PriorityQueue中,当调用poll()方法时,会返回堆顶元素并将其从堆中移除,保持堆的性质。当调用add()方法时,会将元素加入到堆中并保持堆的性质

java 复制代码
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param lists ListNode类ArrayList 
     * @return ListNode类
     */
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        Queue<ListNode> minHeap = new PriorityQueue<>((v1,v2) -> v1.val-v2.val);
        for(int i = 0;i<lists.size();i++){
            if(lists.get(i)!=null){
                minHeap.add(lists.get(i));
            }
        }
        ListNode node = new ListNode(-1);
        ListNode head = node;
        while(!minHeap.isEmpty()){
            ListNode min = minHeap.poll();
            head.next = min;
            head = head.next;
            if(min.next!=null){
                minHeap.add(min.next);
            }
        }
        return node.next;
    }
}
相关推荐
2301_32241428044 分钟前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
君顾18 分钟前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
2601_958352901 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音
happyprince1 小时前
03-regmix-深刻观-哲学与升华
算法
zcmodeltech1 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
一路向阳~负责的男人1 小时前
运动控制算法收录
算法
czt_java1 小时前
5个核心位运算公式
算法
vx_Biye_Design1 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
名字还没想好☜1 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云