U2647's blog 一个热爱学习的 Java 程序员,喜欢 Vue,喜欢深度学习 Dubbo Flutter SpringBoot Debug Notes Java LeetCode Python Redis Android DesignPattern mdi-home-outline 首页 mdi-cloud-outline 标签云 mdi-timeline-text-outline 时间轴 mdi-draw-pen 文章总数 62
23. Merge k Sorted Lists 23. Merge k Sorted Lists LeetCode Merge k Sorted Lists mdi-cursor-default-click-outline 点击量 62

23. Merge k Sorted Lists

Description

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

Translation

合并k个已排序的链接列表并将其作为一个排序列表返回。分析并描述其复杂性。

Ideas

分治 + 归并排序。将数组进行分支,直到每组有两个链表的时候,把这两个链表进行归并排序。

Note

Accept Code

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class MergekLists {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }
        return divide(0, lists.length - 1, lists);
    }

    private ListNode divide(int start, int end, ListNode[] listNodes) {
        if (start == end) {
            return listNodes[start];
        }
        ListNode left = divide(start, (start + end) / 2, listNodes);
        ListNode right = divide((start + end) / 2 + 1, end, listNodes);
        return mergeTwoLists(left, right);
    }

    public ListNode mergeTwoLists(ListNode leftList, ListNode rightList) {
        if (leftList == null) return rightList;
        if (rightList == null) return leftList;

        if (leftList.val < rightList.val) {
            leftList.next = mergeTwoLists(leftList.next, rightList);
            return leftList;
        } else {
            rightList.next = mergeTwoLists(leftList, rightList.next);
            return rightList;
        }
    }
}
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
我的GitHub 我的LeetCode 我的掘金
Powered by Hexo Powered by three-cards
Copyright © 2017 - {{ new Date().getFullYear() }} 某ICP备xxxxxxxx号