当前位置: 首页 > article >正文

23. 合并 K 个升序链表(java)

题目描述:

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

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

示例 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 = [[]]
输出:[]

 代码思路:

采用了分治法进行归并排序,利用了两两合并的方式来合并多个链表。

/**
 * 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==null || lists.length==0){
        return null;
       }
       ListNode[] list2 =sort(lists);
       while(list2.length>1){
        list2 = sort(list2);
       }
       return list2[0];
    }  
     //两两归并
    public ListNode[] sort(ListNode[] lists){
        if(lists.length==1){
            return lists;
        }
        int len;
        if(lists.length%2==0){
           len =lists.length/2;                    
        }else{
           len =lists.length/2+1;
        } 
        ListNode[] newlists = new ListNode[len];
        for(int i=0;i<lists.length/2;i++){
            newlists[i]=merge(lists[i],lists[lists.length-1-i]);
         }
         if(lists.length%2==1){
            newlists[lists.length/2]=lists[lists.length/2];
         } 
         return newlists;
    }
    //合并链表
    public ListNode merge(ListNode list1,ListNode list2){
        ListNode newlist = new ListNode();
        ListNode p=newlist;
        while(list1!=null && list2!=null){
            if(list1.val<=list2.val){
                p.next=list1;
                p=p.next;
                list1=list1.next;
            }
            else{
                p.next=list2;
                p=p.next;
                list2=list2.next;
            }
        }
        if(list1!=null){
            p.next=list1;
        }
        if(list2!=null){
            p.next=list2;
        }
        return newlist.next;
    }
}

 

注意:

循环判断: 使用while (list2.length > 1)来判断是否继续合并。


http://www.kler.cn/a/441083.html

相关文章:

  • 计算机网络一点事(22)
  • 智慧园区系统助力企业智能化升级实现管理效率与安全性全方位提升
  • 记录一次Sqoop从MySQL导入数据到Hive问题的排查经过
  • 快速提升网站收录:避免常见SEO误区
  • SpringBoot源码解析(八):Bean工厂接口体系
  • USB 3.1-GL3510-52芯片原理图设计
  • 基于Vue 3 简单自定义Table组件(乞丐版)
  • C语言刷题(2)
  • phpSpider如何应对网页结构的变化
  • OpenCV目标检测 级联分类器 C++实现
  • 力扣--LCR 158.库存管理II
  • Python与数据库Mysql连接及操作方法
  • Day41 动态规划part08
  • 【C++】模板机制
  • SSM 垃圾分类系统:科技赋能环保新篇
  • Vue Web开发(八)
  • Android 写排行榜,顶部前三
  • 字符2
  • Group FLUX - Summary Essay of the Alpha Phase Problem
  • Next.js流量教程:如何在 Next.js 中添加结构化数据以生成丰富摘要(Rich Snippets)
  • 【现代服务端架构】传统服务器 对比 Serverless
  • 电机控制杂谈(23)——共模电压与轴电流
  • es 开启slowlog
  • UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example
  • 本地部署大模型QPS推理测试
  • sql中case when若条件重复 执行的顺序