题目:
这道题和之前的一道合并两个排序链表有异曲同工之处,本来我想用迭代法写的,可惜才疏学浅,最终还是使用了暴力法
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int i=0;
int temp=0;
// 用于计数list中有多少个null元素
int nullcount=0;
List<ListNode> list=Arrays.asList(lists);
ListNode res=new ListNode(0);
ListNode tempRes=res;
while(list.size()!=nullcount){
temp=0;
int tempVal=Integer.MAX_VALUE;
i=0;
while(i<list.size()){
if(list.get(i)==null) {
i++;
continue;
}
if(tempVal>=list.get(i).val){
tempVal=list.get(i).val;
temp=i;
}
i++;
}
if(list.get(temp)==null) break;
tempRes.next=list.get(temp);
tempRes=tempRes.next;
list.set(temp,list.get(temp).next);
if(list.get(temp)==null) nullcount++;
}
return res.next;
}
}
运行结果自然也是不太好:
不过我在题解中看到了一个非常有意思的算法——分而治之
将一个数组,分成多个,两两进行重组
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
return merge(lists, 0, lists.length - 1);
}
private ListNode merge(ListNode[] lists, int left, int right) {
if (left == right) return lists[left];
int mid = left + (right - left) / 2;
ListNode l1 = merge(lists, left, mid);
ListNode l2 = merge(lists, mid + 1, right);
return mergeTwoLists(l1, l2);
}
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
作者:powcai
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/leetcode-23-he-bing-kge-pai-xu-lian-biao-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
mergeKLists方法和mergeTwoLists方法都很清楚明了
这里就对上方的merge方法进行画图分析:
第一次进去的数据是这样的
l1:
所以需要进一步迭代
求出l1中的‘l1’=A,‘l2'=B
l1=mergeTwoLists(A,B)
l2:
l2也要进一步迭代
求出l2中的‘l1’=C,‘l2’=D
l2=mergeTwoLists(C,D)
所以最终返回的结果就是 mergeTwoLists(l1,l2);
运行效率远超暴力法
如果大家有什么更好的方法或建议,可以在评论留言哦