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

LeetCode 23 : 合并K个升序链表

题目:
在这里插入图片描述

解题思路:
1.将多个链表合并为两个链表
2.使用21题用的,将两个有序链表合并

代码示例:

package com.zy.leetcode.LeetCode_23;

/**
 * @Author: zy
 * @Date: 2024-12-26-21:37
 * @Description: 合并K个升序链表
 * 多路递归
 */
public class ListNode_23 {

    private int val;

    private ListNode_23 next;

    public ListNode_23(int val, ListNode_23 next) {
        this.val = val;
        this.next = next;
    }

    public ListNode_23() {
    }

    public ListNode_23(int val) {
        this.val = val;
    }

    // 链表打印
    private void print(ListNode_23 node) {
        while (node != null) {
            System.out.print(node.val + " -> ");
            node = node.next;
        }
    }

    /**
     * 合并两个有序链表
     *
     * @param p1
     * @param p2
     * @return
     */
    private static ListNode_23 mergeList3(ListNode_23 p1, ListNode_23 p2) {
        // 特殊情况快速返回
        if (p1 == null) {
            return p2;
        }
        if (p2 == null) {
            return p1;
        }

        if (p1.val <= p2.val) {
            p1.next = mergeList3(p1.next, p2);
            return p1;
        } else {
            p2.next = mergeList3(p1, p2.next);
            return p2;
        }
    }

    /**
     * 返回后生成的链表
     *
     * @param lists 初始链表集合
     * @param i     左边界
     * @param j     右边界
     * @return
     */
    private static ListNode_23 spiltList(ListNode_23[] lists, int i, int j) {
        //数组内只有一个链表
        if (i == j) {
            return lists[i];
        }

        int m = (i + j) >>> 1;
        ListNode_23 left = spiltList(lists, i, m);
        ListNode_23 right = spiltList(lists, m + 1, j);
        return mergeList3(left, right);
    }

    //传入一个数组,初始化链表
    public static ListNode_23 initListNode(int[] arr) {
        ListNode_23 dummy = new ListNode_23(0);
        ListNode_23 cur = dummy;
        for (int num : arr) {
            cur.next = new ListNode_23(num);
            cur = cur.next;
        }
        return dummy.next;
    }

    /**
     * 初始化方法,传入多个数组生成链表
     */
    public static ListNode_23[] initLists(int[][] arrays) {
        ListNode_23[] lists = new ListNode_23[arrays.length];
        for (int i = 0; i < arrays.length; i++) {
            lists[i] = initListNode(arrays[i]);
        }
        return lists;
    }

    private static ListNode_23 mergeKLists(ListNode_23[] lists) {
        if (lists.length == 0) {
            return null;
        }
        return spiltList(lists, 0, lists.length - 1);
    }

    public static void main(String[] args) {
        int[][] arrays = {{1, 4, 5}, {1, 3, 4}, {2, 6}};
        ListNode_23[] lists = initLists(arrays);
        ListNode_23 result = mergeKLists(lists);
        result.print(result);
    }

}

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

相关文章:

  • 如何配置Java应用程序的远程调试
  • Wireshark 具体某种协议的分析
  • 现代网络基础设施中的 TCP 握手之下
  • 【092】基于51单片机水位控制系统【Proteus仿真+Keil程序+报告+原理图】
  • python文件操作相关(excel)
  • 构建代理 IP 池:方法与实践
  • 【YashanDB知识库】如何在备机节点上做备份和恢复
  • 学术主题研究相关10个ChatGPT提示词
  • 护眼屏幕灯市场格局正在重塑:书客屏幕挂灯如何成为办公新宠
  • 开源的Vue低代码表单设计器 form-create-designer v3.2.9 版本发布,新增10多种功能
  • mysql8 从C++源码角度看 客户端发送的sql信息 mysql服务端从网络读取到buff缓存中
  • 基于文生图模型的创新应用
  • 《量子AI:突破量子比特稳定性与容错性的关键瓶颈》
  • Cursor小试2.pdf转图片
  • Mac连接云服务器工具推荐
  • Unreal Engine 5 C++ Advanced Action RPG 三、四章笔记
  • 1177:奇数单增序列
  • vue中修改局部的elmentUI样式
  • Python将两个视频横向的拼接--视频效果对比
  • yolo数据集 - 2130张边坡排水沟堵塞数据集分享 - 无人机采集与数据增强处理