【链表】Leetcode 23. 合并 K 个升序链表【困难】

合并 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

解题思路

合并多个有序链表可以使用归并排序的思想

  • 使用分治法,将链表数组分为两半。
  • 递归地合并左半部分和右半部分。
  • 合并两个有序链表的方法,即使用合并两个有序链表的算法。

Java实现

public class MergeKSortedLists {

    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }

        return mergeLists(lists, 0, lists.length - 1);
    }

    private ListNode mergeLists(ListNode[] lists, int left, int right) {
        if (left == right) {
            return lists[left];
        }

        int mid = left + (right - left) / 2;
        ListNode leftList = mergeLists(lists, left, mid);
        ListNode rightList = mergeLists(lists, mid + 1, right);

        return mergeTwoLists(leftList, rightList);
    }

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

    public static void main(String[] args) {
        // 构造链表数组
        ListNode[] lists = new ListNode[3];
        lists[0] = new ListNode(1);
        lists[0].next = new ListNode(4);
        lists[0].next.next = new ListNode(5);

        lists[1] = new ListNode(1);
        lists[1].next = new ListNode(3);
        lists[1].next.next = new ListNode(4);

        lists[2] = new ListNode(2);
        lists[2].next = new ListNode(6);

        // 调用 mergeKLists 方法合并链表数组
        MergeKSortedLists solution = new MergeKSortedLists();
        ListNode result = solution.mergeKLists(lists);

        // 打印合并后的链表
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
        // 输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6
    }
}

时间空间复杂度

  • 时间复杂度:O(nlogk),其中 n 是所有链表中的节点总数,k 是链表的个数,每一层合并的时间复杂度为 O(n),总共有 O(logk) 层。
  • 空间复杂度:O(log(K) + n),其中 log(K) 是递归深度,n 是链表的长度。

相关推荐

  1. Leetcode 23. 合并 K 升序困难

    2024-03-23 09:08:01       43 阅读
  2. LeetCode-23. 合并 K 升序

    2024-03-23 09:08:01       45 阅读
  3. LeetCode-23 合并 K 升序

    2024-03-23 09:08:01       65 阅读
  4. LeetCode 23 合并 K 升序

    2024-03-23 09:08:01       61 阅读
  5. LeetCode23.合并K升序

    2024-03-23 09:08:01       47 阅读
  6. 23. 合并 K 升序 - 力扣(LeetCode)

    2024-03-23 09:08:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 09:08:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 09:08:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 09:08:01       87 阅读
  4. Python语言-面向对象

    2024-03-23 09:08:01       96 阅读

热门阅读

  1. 6-190 先序输出叶节点

    2024-03-23 09:08:01       42 阅读
  2. 【Leetcode】代码随想录D13|栈与队列3.0

    2024-03-23 09:08:01       45 阅读
  3. Python 很简单。 Go 很简单。简单!=简单。

    2024-03-23 09:08:01       43 阅读
  4. S29GL064S的数据手册

    2024-03-23 09:08:01       34 阅读
  5. String类(一)

    2024-03-23 09:08:01       51 阅读
  6. 深入解析Oracle数据库的Buffer Cache

    2024-03-23 09:08:01       35 阅读
  7. [C语言]memcpy memmove的模拟实现 memcmp memset解析

    2024-03-23 09:08:01       43 阅读
  8. 查找DNS解析记录

    2024-03-23 09:08:01       40 阅读