• 牛客网高频算法题系列BM5合并k个已排序的链表


    牛客网高频算法题系列-BM5-合并k个已排序的链表

    题目描述

    合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

    原题目见:BM5 合并k个已排序的链表

    解法一:分治法

    分治法,可以将大问题分解成小问题,然后继续分解成最小的子问题并解决之。

    具体处理过程如下,将k个链表分解成2部分处理,递归处理这2部分,并调用 BM4 合并两个排序的链表 中的方法将2个合并好的链表进行合并,最小的子问题的条件是:

    • 没有待合并的链表,直接返回空。
    • 如果只有一个链表,则不需要合并,直接返回该链表。

    如果不满足,则需要继续分解并递归处理。

    说明:BM4 合并两个排序的链表,请参考 牛客网高频算法题系列-BM4-合并两个排序的链表。

    代码

    import com.google.common.collect.Lists;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Bm005 {
        /**
         * 分治法
         *
         * @param lists
         * @return
         */
        public static ListNode mergeKLists(List<ListNode> lists) {
            // 如果没有待合并的链表,直接返回空
            if (lists == null || lists.size() == 0) {
                return null;
            }
            // 如果只有一个链表,则不需要合并,直接返回该链表
            if (lists.size() == 1) {
                return lists.get(0);
            }
            int left = 0, right = lists.size();
            int mid = (left + right) / 2;
            // 递归调用当前方法将原有的链表集合分成2部分分别进行合并
            // 然后调用 BM4 合并两个排序的链表 中的方法将2个合并好的链表进行合并
            return Bm004.merge(mergeKLists(lists.subList(0, mid)), mergeKLists(lists.subList(mid, right)));
        }
    
        public static void main(String[] args) {
            ListNode listNode1 = ListNode.testCase3();
            System.out.println("链表一");
            ListNode.print(listNode1);
            ListNode listNode2 = ListNode.testCase4();
            System.out.println("链表二");
            ListNode.print(listNode2);
            ListNode listNode3 = new ListNode(7);
            System.out.println("链表三");
            ListNode.print(listNode3);
            ArrayList<ListNode> lists = Lists.newArrayList(listNode1, listNode2, listNode3);
            ListNode result = mergeKLists(lists);
            // 测试用例,期望输出: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
            System.out.println("合并后的链表");
            ListNode.print(result);
        }
    }
    

    \(1.01^{365} ≈ 37.7834343329\)
    \(0.99^{365} ≈ 0.02551796445\)
    相信坚持的力量!

  • 相关阅读:
    微信公众号菜单demo
    Hosts 广告
    thinkphp用swiftmailer发邮件demo
    微信小程序小结(4) -- 分包加载及小程序间跳转
    微信小程序小结(5) -- 常用语法
    常用SQL语句及在node中使用MySQL
    JavaScript -- tips
    CSS3 -- FlexBox(弹性盒子)
    gulp使用文档
    yarn快速使用及实践建议
  • 原文地址:https://www.cnblogs.com/kaesar/p/16324325.html
Copyright © 2020-2023  润新知