首页 > 其他分享 >力扣---23. 合并 K 个升序链表

力扣---23. 合并 K 个升序链表

时间:2023-08-12 15:57:51浏览次数:40  
标签:--- ListNode lists next 链表 node1 升序 node2

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

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

 

示例 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

 

暴力法,直接遍历,每次取值最小的节点加入,然后该节点指向 next,直到所有节点都为 null

分治法:每次将两个 ListNode 合并成一条,直到所有的 ListNode 全都合并成一条。

优先队列:将所有的节点都存入优先队列中,重写比较器使之可以比较链表节点的大小。

优先队列:

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode head = new ListNode(Integer.MIN_VALUE);
        ListNode node = head;
        PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> (a.val - b.val));
        for (ListNode tem : lists) {
            if (tem != null) {
                queue.add(tem);
            }
        }
        while (!queue.isEmpty()) {
            ListNode tem = queue.poll();
            node.next = tem;
            node = node.next;
            tem = tem.next;
            if (tem != null) {
                queue.add(tem);
            }
        }
        return head.next;
    }
}

 归并:

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) {
            return null;
        }
        int len = (lists.length + 1) / 2;
        while (lists.length > 1) {
//            归并,两两进行合并,如果长度为单数,则直接放到后面合并即可。
            ListNode[] nodes = new ListNode[len];
            if ((lists.length & 1) == 0) {
                for (int i = 0; i < len; i++) {
                    nodes[i] = mergeList(lists[i * 2], lists[i * 2 + 1]);
                }
            } else {
                for (int i = 0; i < len - 1; i++) {
                    nodes[i] = mergeList(lists[i * 2], lists[i * 2 + 1]);
                }
                nodes[len - 1] = lists[lists.length - 1];
            }
            lists = nodes;
            len = (lists.length + 1) / 2;
        }
        return lists[0];
    }

    /**
     * 合并两链表
     */

    public ListNode mergeList(ListNode node1, ListNode node2) {
        if (node1 == null) {
            return node2;
        } else if (node2 == null) {
            return node1;
        }
        ListNode head;
        if (node1.val > node2.val) {
            head = node2;
            node2 = node2.next;
        } else {
            head = node1;
            node1 = node1.next;
        }
        ListNode node = head;
        while (node1 != null && node2 != null) {
            if (node1.val > node2.val) {
                node.next = node2;
                node2 = node2.next;
            } else {
                node.next = node1;
                node1 = node1.next;
            }
            node = node.next;

        }
        node.next = node1 == null ? node2 : node1;
        return head;
    }
}

 

标签:---,ListNode,lists,next,链表,node1,升序,node2
From: https://www.cnblogs.com/allWu/p/17624913.html

相关文章

  • 复习 - Java 基本语法
    前言有两年没有怎么使用过Java了,重新复习一下基础的内容,特此记录。视频课程为B站尚硅谷宋红康java基础视频。关键字和保留字关键字定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中的所有字母都为小写保留字定义:现有的Java版本尚未使用,但以后版本......
  • How to set z-index order in Canvas using javascript All In One
    Howtosetz-indexorderinCanvasusingjavascriptAllInOne如何使用javascript在Canvas中设置z-index顺序globalCompositeOperation//全局作用域globalscopeconstcvs=document.querySelector("#canvas");constctx=canvas.ge......
  • 【考后总结】8 月 CSP-S 模拟赛 4
    CSP模拟19ItstartedoffsowellTheysaidwemadeaperfectpairIclothedmyselfinyourgloryandyourloveHowIlovedyouHowIcriedTheyearsofcareandloyaltyWerenothingbutashamitseemsTheyearsbeliewelivedthelieIloveyou'......
  • 无涯教程-Perl - my函数
    描述此函数声明LIST中的变量在包围式块内按词法范围。如果指定了多个变量,则所有变量都必须用括号括起来。语法以下是此函数的简单语法-myLIST返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perl-wmy$string="Wearetheworld";p......
  • 使用create-vue创建vue3项目
    create-vue是vue3新的脚手架搭建项目工具,底层构建工具使用vite,而不是vue-cli的webpack。但不是说你不能用以前的vuecreate命令来创建vue3项目,你完全可以用vue-cli来创建。vite:https://cn.vitejs.dev/guide/#scaffolding-your-first-vite-project使用create-vue创建项目使用cr......
  • create-vue和vue-cli创建项目的差异
    这里对比的是vue-cli和create-vue创建vue3项目的文件中的内容差异。原来public中的index.html被移动到根目录:(原因见这里:)https://cn.vitejs.dev/guide/#index-html-and-project-root<!--不同点1:script放在了最前面,方便编写代码,实际上你给他放在最后面也没问题.script属......
  • 组合式api-通过reactive和ref提供响应式数据
    在setup中如果是直接定义遍历数据并不是响应式数据,和vue2中的data选项提供的数据不一样,vue2的data中返回的数据全部都是响应式数据。<scriptsetup>//这样提供的数据并不是响应式数据,和vue2中的data选项提供的数据并不是一样。letstate=888constgetState=()=>{......
  • 组合式api-侦听器watch的语法
    和vue2对比,也是语法上稍有不同。监听单个数据对象<scriptsetup>import{ref,watch}from"vue";constcount=ref(100)//语法:watch(响应式数据对象,(newVal,oldVal)=>{业务处理...}//只监听单个数据//watch(count,(newValue,oldValue)=>{//console.l......
  • 组合式api-计算属性computed的使用
    计算属性在vue3中和vue2的思想概念都是一样,唯一区别就是在使用组合式api时候的语法稍有不同。使用步骤:导入computed函数import{computed}from'vue'使用computed函数<scriptsetup>import{computed,ref}from"vue";constarr=ref([1,2,3,4,5,6,7,8,9,......
  • 组合式api-ref引用子组件、dom元素, defineExpose的使用
    和vue2一样,我们有时候希望父组件能够调用子组件中的方法、属性。那么就要用到ref。然后你会发现,根本调用不了子组件中的方法"sonSayHi",如下图:原因:使用......