codeTop100题(25)23. 合并 K 个升序链表

80 阅读1分钟

1. 题目

23. 合并 K 个升序链表

2. 分析

image.png

2.1 方案1

我们可以死循环得遍历每一个链表,一直到所有链表都为空。例如: 空间复杂度是:o(总数 * 链表数 * 链表长度)大概为o(n^4) n为链表数量

2.2 方案2

借助归并排序或者堆排序的私聊,我们可以以n的时间复杂度完成排序;

3. 代码

3.1 方案一代码

public ListNode mergeKLists(ListNode[] lists) {

    ListNode pre = new ListNode(0);
    ListNode head = pre;
    while (true) {
        int index = 0;
        ListNode max = null;
        for (int i = 0; i < lists.length; i++) {
            if (null == lists[i]) {
                continue;
            }
            if (null == max) {
                max = lists[i];
                index = i;
                continue;
            }
            if (lists[i].val < max.val) {

                max = lists[i];
                index = i;
            }
        }
        if (max == null) {
            return pre.next;
        }
        head.next = max;
        head = head.next;
        lists[index] = lists[index].next;
    }
}

3.2 方案二代码

public ListNode mergeKLists(ListNode[] lists) {
    PriorityQueue<ListNode> priorityQueue = new PriorityQueue<>(new Comparator<ListNode>() {
        @Override
        public int compare(ListNode o1, ListNode o2) {
            return o1.val - o2.val;
        }
    });
    //排序
    for (ListNode list : lists) {
        while (null != list) {
            ListNode temp = list;
            priorityQueue.offer(list);
            list = list.next;
            temp.next = null;
        }
    }
    //
    ListNode newHead = new ListNode(0);
    ListNode head = newHead;

    while (!priorityQueue.isEmpty()) {
        head.next = priorityQueue.poll();
        head = head.next;
    }
    return newHead.next;
}