算法:Merge k Sorted Lists(合并 k 个排序链表)

说明

算法:Merge k Sorted Lists
LeetCode地址: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 为总链表个数,N 为总元素个数,那么其时间复杂度为 O(Nlogk)。

代码实现

/**
 * 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;
        return helper(lists, 0, lists.length - 1);
    }

    private ListNode helper(ListNode[] lists, int left, int right) {
        if (left >= right) return lists[left];
        int mid = left + right >>> 1;
        ListNode l0 = helper(lists, left, mid);
        ListNode l1 = helper(lists, mid + 1, right);
        return merge2Lists(l0, l1);
    }

    private ListNode merge2Lists(ListNode l0, ListNode l1) {
        ListNode node = new ListNode(0), tmp = node;
        while (l0 != null && l1 != null) {
            if (l0.val <= l1.val) {
                tmp.next = new ListNode(l0.val);
                l0 = l0.next;
            } else {
                tmp.next = new ListNode(l1.val);
                l1 = l1.next;
            }
            tmp = tmp.next;
        }
        tmp.next = l0 != null ? l0 : l1;
        return node.next;
    }
}

代码分析

那上面的例子来分析分而治之的思想:lists的length为3,
也就是求 helper(lists, 0, 2)

  		/\

helper(lists, 0, 1) ------ helper(lists, 2, 2)
/\
helper(lists, 0, 0) — helper(lists, 1, 1)
所以 merge2Lists,先merge了 helper(lists, 0, 0) — helper(lists, 1, 1),
得到helper(lists, 0, 1),
merge2Lists 再merge了 helper(lists, 0, 1) ------ helper(lists, 2, 2),
得到最终的结果helper(lists, 0, 2)

代码执行效率

Runtime: 7 ms, faster than 90.19% of Java online submissions for Merge k Sorted Lists.
Memory Usage: 41.2 MB, less than 15.81% of Java online submissions for Merge k Sorted Lists.

总结

考查链表,分而治之思想。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/note/023/README.md

猜你喜欢

转载自blog.csdn.net/zgpeace/article/details/87912908