原题链接
讨论澄清
此题是在合并两条链表的基础上,扩展成多条链表的,因此我们就应该将他再次细分成两条链表的合并的思路来处理,再将K条链表分解成两条两条链表的合并这个过程要利用分治的思想。
思路简述
注意事项
具体代码
class Solution {
/**
结合昨天的合并两个链表的方法,对链表进行分治,利用递归的方法转化为两个两个链表的合并
*/
public ListNode mergeKLists(ListNode[] lists) {
return merge(lists, 0, lists.length - 1);
}
public ListNode merge(ListNode[] list,int begin,int end){
//如果数组中只有一组链表 那么就只返回一组数据
if(begin==end){
return list[begin];
}
//元素为空则返回空
if(begin>end){
return null;
}
//两组数据以上的情况,进行分治、两组两组的合并
int mid = (begin+end)/2;
return mergeTwoLists(merge(list,begin,mid),merge(list,mid+1,end));
}
//两组合并的方法完全照抄昨天的题解:合并两个有序链表的代码
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
ListNode dummyhead = new ListNode();
ListNode newnode = new ListNode();
dummyhead = newnode;
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
newnode.next = l1;
l1 = l1.next;
}else{
newnode.next = l2;
l2 = l2.next;
}
newnode = newnode.next;
}
//如果链表l1先合并完,那么就把l2剩余的节点接在合并的链表末尾
if(l1==null){
newnode.next = l2;
while(l2!=null){
newnode = newnode.next;
l2 = l2.next;
}
}
//如果链表l2先合并完,那么就把剩余的节点接在合并的链表末尾
if(l2==null){
newnode.next = l1;
while(l1!=null){
newnode = newnode.next;
l1 = l1.next;
}
}
return dummyhead.next;
}
}