LeetCode #23. Merge k Sorted Lists プログラミング練習

問題:
f:id:stlisacity:20180526221501p:plain
難易度: hard
入力: ListNodeのリスト
目的: 入力されたLinkedLIstをマージせよ
出力: ListNode

♯21問めに、二つのソートされたLinkedListをマージする問題がありましたが、
今回はそれの延長問題です。
21問目と同様、入力のリスト群はすべてソートされています。
難点はリストが二つだけではないので、次の数字がどのリストに入っているのかがわからないところです。

注意すべき事: 

  • 全体探索をするとO(n^k)で時間がTLEになってしまう。

以下回答です。

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        return helper(lists, 0, lists.length-1);
    }
    
    public ListNode helper(ListNode[] lists, int left, int right) {
        if (left == right) return lists[left];
        if (left < right) {
            int mid = (left + right)/2;
            ListNode l1 = helper(lists, left, mid);
            ListNode l2 = helper(lists, mid+1, right);
            return merge(l1, l2);
        }
        else return null;
    }
    
    public ListNode merge(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        if (l1.val < l2.val) {
            l1.next = merge(l1.next,l2);
            return l1;
        }
        else {
            l2.next = merge(l1, l2.next);
            return l2;
        }
    }
}

recursiveとpartitionを使った回答です。
mergeの関数は#21問目と全く同じです。
二つのソートされたLinkedListをマージする関数です。
それに加え、Partitionを使っています。
それにより入力されたリスト群を二つずつマージしていく方法です。
Time complexity は O(nklogk)になります。

以上。
よいプログラミング生活を!