【递归与分治】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需要更新为归回来的那个更小的链表节点)

代码实现

java 复制代码
    /**
     * 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个链表依次拆解
java 复制代码
    /**
     * 合并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;
    }

拆解链表递归执行流程

相关推荐
小娄~~8 小时前
C语言卷子错题集
c语言·开发语言·数据结构
过期动态10 小时前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展
风筝在晴天搁浅10 小时前
阿里 LeetCode 876.链表的中间节点
算法·leetcode·链表
玖釉-11 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
05候补工程师11 小时前
【408考研·数据结构专题】二叉树、树与森林、线索树及哈夫曼树核心考点与秒杀技巧深度总结
数据结构·经验分享·笔记·考研·算法
Dlrb121111 小时前
数据结构-队列,循环队列,哈希表
数据结构·哈希表·队列·循环队列·哈希存储
2401_8685347813 小时前
数据结构简答题100问
数据结构
代码中介商14 小时前
B树:数据库索引的高效基石
数据结构·数据库
小糯米60114 小时前
C语言 自定义类型:结构体 与 联合体
c语言·开发语言·数据结构
chengO_o15 小时前
AVL树详解与实现(C++)
数据结构·c++·avl树·平衡二叉搜索树