Leetcode面试经典150题-23.合并K个升序链表

解法都在代码里,不懂就留言或者私信

这个解法不是最优解,但是面试应该够了,实在是时间有点紧没时间写了,最优解的原理跟这个差不多,过几天补充

public static ListNode mergeKLists(ListNode[] lists) {
        if(lists == null || lists.length == 0) {
            return null;
        }
        if(lists.length == 1) {
            return lists[0];
        }
        /**大于1的情况下每次合并两个,然后拿结果和下一个合并,先把0位置的作为head*/
        ListNode head = lists[0];
        for(int i = 1; i < lists.length; i++) {
            /**和上一步的结果合并完之后更新head*/
            head = merge(head, lists[i]);
        }
        return head;
    }

    public static ListNode merge(ListNode l1, ListNode l2) {
        /**排除两个都是空的,合并完还是空*/
        if(l1 == null && l2 == null) {
            return null;
        }
        /**一个为空返回另外一个*/
        if(l1 == null || l2 == null) {
            return l1 == null? l2 : l1;
        }
        /**都不为空的情况,先定一个一个遍历head用于存储最终的合并完的链表的头*/
        ListNode head = null;
        ListNode last = null;
        /**如果两个链表都还不为空*/
        while(l1 != null && l2 != null) {
            /**每次选取最小的作为当前的节点*/
            ListNode cur = l1.val <= l2.val? l1 : l2;
            /**head只初始化一次,head为空,last必然为空*/
            if(head == null) {
                head = cur;
                last = cur;
            } else {
                /**原来链表有节点,则把当前节点串到最后,当前作为最后一个节点*/
                last.next = cur;
                last = cur;
            }
            /**cur是谁谁跳下一个,否则不动*/
            l1 = cur == l1? l1.next : l1;
            l2 = cur == l2? l2.next : l2;
        }
        /**如果l1没有用完,把l1挂到last的后面即可*/
        if(l1 != null) {
            last.next = l1;
        }
        /**如果l2没有用完,把l2挂到last的后面即可*/
        if(l2 != null) {
            last.next = l2;
        }
        return head;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值