题目地址:https://oj.leetcode.com/problems/merge-k-sorted-lists/
这个题目其实就是merge two sorted lists 的升级系列,最直接的方法就是选取一个ListNode 与剩下的每一个ListNode调用 merge two sorted lists 方法。
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if(lists.size() ==0)
return null;
ListNode Pmerge = lists.get(0);
for(int i=1;i<lists.size();i++){
Pmerge = mergeTwoLists(Pmerge, lists.get(i));
}
return Pmerge;
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode Pmerge = null;
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
if(l1.val<l2.val){
Pmerge = l1;
Pmerge.next = mergeTwoLists(l1.next, l2);
}else {
Pmerge = l2;
Pmerge.next = mergeTwoLists(l1, l2.next);
}
return Pmerge;
}
}
这样能过通过在线测试,但是反过来想我们会发现这效率肯定不高,如果 有n 个ListNode ,每个长度为K,时间复杂度为O(n *K^2). 很容易想到我们知道一类排序叫归并排序,两两递归到最小元素排序然后回溯回来实现整体排序,进行细微改动变换为利用归并排序。
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if(lists.size() ==0)
return null;
return helper(lists, 0, lists.size()-1);
}
public ListNode helper(List<ListNode> lists ,int l ,int r){
if(l<r){
int mid = (l+r)/2;
return mergeTwoLists(helper(lists, l, mid), helper(lists, mid+1, r));
}
return lists.get(l);
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode Pmerge = null;
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
if(l1.val<l2.val){
Pmerge = l1;
Pmerge.next = mergeTwoLists(l1.next, l2);
}else {
Pmerge = l2;
Pmerge.next = mergeTwoLists(l1, l2.next);
}
return Pmerge;
}
}
这时时间复杂度变为了:O(nKlogK)。优化不少性能。