用分治算法,每次合并两个
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
//调用分治算法两两进行合并
return merge(lists,0,lists.length - 1);
}
private ListNode merge(ListNode[] lists,int begin,int end){
//判断是否需要在分割
if (begin == end)
return lists[begin];
if (begin > end)
return null;
//此时进行分割
int mid = (begin + end) / 2;
//合并左右两项
//递归生成两边
return mergeTwoListNode(merge(lists,begin,mid),merge(lists,mid + 1,end));
}
private ListNode mergeTwoListNode(ListNode merge, ListNode merge1) {
//生成原始表头
ListNode newHead = new ListNode(-1);
ListNode p1,p2;
p1 = merge;
p2 = merge1;
ListNode tmp = newHead;
while (p1 != null && p2 != null){
if (p1.val < p2.val){
tmp.next = p1;
tmp = p1;
p1 = p1.next;
}
else {
tmp.next = p2;
tmp = p2;
p2 = p2.next;
}
}
if (p1 != null)
tmp.next = p1;
else if (p2 != null)
tmp.next = p2;
return newHead.next;
}
}