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

【递归与分治】Leetcode23:合并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 = [[]]
输出:[]

二、解题思路

分治思想
  • 将大问题划分为两个到多个子问题
  • 子问题可以继续拆分成更小的子问题,直到能够简单求解
  • 如有必要,将子问题的解进行合并,得到原始问题的解

分而治之,分到区间内只有一个链表,合并区间;所以问题就转化为了合并两个有序链表。

2.1 合并两个有序链表

leetcode21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

思路
递归函数返回

  • 更小的那个链表节点,并把它剩余节点与另一个链表再次递归
  • 返回之前更新此节点的 next(原本的next需要更新为归回来的那个更小的链表节点)

代码实现

    /**
     * Leetcode21: 合并两个有序链表【递归】
     * @param list1
     * @param list2
     * @return
     */
    public static ListNode mergeTwoSortedListsRecursion(ListNode list1, ListNode list2) {
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }
        if (list1.val < list2.val) {
            ListNode listNode = mergeTwoSortedListsRecursion(list1.next, list2);
            list1.next = listNode;
            return list1;
        } else {
            ListNode listNode = mergeTwoSortedListsRecursion(list1, list2.next);
            list2.next = listNode;
            return list2;
        }
    }

递归执行流程
合并两个有序链表

2.2 把k个链表依次拆解
    /**
     * 合并k个升序链表
     * @param lists
     * @return
     */
    public static ListNode mergeKListsRecursion(ListNode[] lists) {
        if (lists == null) {
            return null;
        }
        return split(lists, 0, lists.length - 1);
    }

    /**
     * 把k个链表依次拆解,拆到只剩下一个,两两合并
     * @param lists
     * @param i
     * @param j
     * @return
     */
    public static ListNode split(ListNode[] lists,int i,int j) {
        // 拆到数组中只剩下一个元素时终止递归 此时i和j重合
        if (i == j) {
            return lists[i];
        }
        int mid = (i+j) >>> 1;
        ListNode left = split(lists, i, mid);
        ListNode right = split(lists, mid+1, j);
        //合并后的链表
        ListNode listNode = mergeTwoSortedListsRecursion(left, right);
        return listNode;
    }

拆解链表递归执行流程
在这里插入图片描述


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

相关文章:

  • WebSocket监听接口
  • 缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)
  • QT自定义工具条渐变背景颜色一例
  • 《Spring Framework实战》9:4.1.4.依赖注入
  • 腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器
  • 【Unity3D】Text文本文字掉落效果
  • Redis--20--大Key问题解析
  • Mono里运行C#脚本26—CEE_ADD/MONO_CEE_ADD/OP_IADD/X86_ADD的转换过程
  • java项目学科竞赛管理系统的设计与实现源码(springboot+mysql+vue)
  • 预训练语言模型——BERT
  • 【免费】2000-2019年各省技术市场成交额数据
  • 字玩FontPlayer开发笔记9 Tauri2打包应用
  • Golang的并发编程框架比较
  • ASP.NET Core实现微服务--什么是微服务
  • Java语法总结
  • 【Uniapp-Vue3】computed计算属性用法及方法对比
  • Scratch024(糖饼印花)
  • 数据分析思维(九):分析方法——AARRR模型分析方法
  • docker minio镜像arm64架构
  • Ruby语言的软件开发工具
  • 精选2款.NET开源的博客系统
  • 表达式翻译 一
  • Agentic AI 深度剖析
  • Spark创建多种数据格式的DataFrame
  • 消息队列:原理、问题与设计全解析
  • BERT模型详解及代码复现