23. 合并K个排序链表

1.题目

在这里插入图片描述

2.解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        // 每轮将两两链表合并,直到最后只剩一个链表
        // 重复使用已有的lists
        int len = lists.length;
        if (len == 0) {
            return null;
        }

        while (len > 1) {
            for (int i = 0; i < len/2 ; i++) {
                // 如果使用2*i、2*i+1下标的话,会使得存储的数组元素不连续
                lists[i] = mergeTlists(lists[i], lists[len-1-i]);
            }
            len = (len + 1) / 2;
        }
        return lists[0];
        
    }
    public ListNode mergeTlists(ListNode tmp1, ListNode tmp2) {
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
        while (tmp1 != null && tmp2 != null) {
            if (tmp1.val >= tmp2.val) {
                head.next = tmp2;
                tmp2 = tmp2.next;
            } else {
                head.next = tmp1;
                tmp1 = tmp1.next;
            }
            head = head.next;
        }
        head.next = tmp1 != null ? tmp1 : tmp2;
        return dummy.next;
    }
}

时间复杂度O(Nlogk) k为链表个数,N为链表平均长度 ,每次合并logk次,总共有N个需要连接,空间复杂度O(1),使用常数级变量

3.思考

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值