【LeetCode】 23. Merge k Sorted Lists 合并K个排序链表(Hard)(JAVA)

烈酒焚心 提交于 2020-03-01 11:35:33

【LeetCode】 23. Merge k Sorted Lists 合并K个排序链表(Hard)(JAVA)

题目地址: https://leetcode.com/problems/merge-k-sorted-lists/

题目描述:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

题目大意

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

解题方法

直接判断每一个链表的最小值
较耗时,直接可以想到

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode res = new ListNode(0);
        ListNode pre = res;
        while (pre != null) {
            int index = -1;
            for (int i = 0; i < lists.length; i++) {
                if (lists[i] == null) continue;
                if (index < 0 || lists[i].val < lists[index].val) {
                    index = i;
                }
            }
            if (index < 0) {
                pre = null;
            } else {
                pre.next = lists[index];
                pre = lists[index];
                lists[index] = lists[index].next;
            }
        }
        return res.next;
    }
}

执行用时 : 328 ms, 在所有 Java 提交中击败了 10.59% 的用户
内存消耗 : 41.2 MB, 在所有 Java 提交中击败了 56.04% 的用户

耗时短的方法
采用合并排序法,两两合并,最后得到结果

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length <= 0) return null;
        int n = lists.length;
        while (n > 1) {
            int len = n % 2 == 0 ? n / 2 : (n / 2 + 1);
            for (int i = 0; i < n / 2; i++) {
                lists[i] = merge(lists[i], lists[i + len]);
            }
            n = len;
        }
        return lists[0];
    }

    public ListNode merge(ListNode node1, ListNode node2) {
        ListNode res = new ListNode(0);
        ListNode pre = res;
        ListNode cur = null;
        while (node1 != null || node2 != null) {
            if (node2 == null) {
                cur = node1;
                node1 = node1.next;
            } else if (node1 == null) {
                cur = node2;
                node2 = node2.next;
            } else if (node1.val > node2.val) {
                cur = node2;
                node2 = node2.next;
            } else {
                cur = node1;
                node1 = node1.next;
            }
            pre.next = cur;
            pre = cur;
        }
        return res.next;
    }
}

执行用时 : 3 ms, 在所有 Java 提交中击败了 83.70% 的用户
内存消耗 : 41.3 MB, 在所有 Java 提交中击败了 53.66% 的用户

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!