leetcode 算法 23. 合并K个排序链表
第一直觉解法,基于 21. 合并两个有序链表 ,依次合并
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode node = new ListNode(Integer.MIN_VALUE);
for(int i=0;i<lists.length;i++){
node = mergeTwoList(node,lists[i]);
}
return node.next;
}
public ListNode mergeTwoList(ListNode node1,ListNode node2){
if(null == node1){
return node2;
}else if(null == node2){
return node1;
}else if(node1.val <= node2.val){
node1.next = mergeTwoList(node1.next,node2);
return node1;
}else {
node2.next = mergeTwoList(node1,node2.next);
return node2;
}
}
}
提交后 运行时间 281 ms 效率较低
优化方案 : 不需要逐一合并,可以采取分治法,两两合并得到最终结果
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(null == lists || lists.length == 0){
return null;
}
return merge(lists,0,lists.length-1);
}
public ListNode merge(ListNode[] lists,int left,int right){
if(left == right){
return lists[left];
}
//分区处理
int mid = left + (right - left) / 2;
ListNode node1 = merge(lists,left,mid);
ListNode node2 = merge(lists,mid+1,right);
//合并处理
return mergeTwoList(node1,node2);
}
public ListNode mergeTwoList(ListNode node1,ListNode node2){
if(null == node1){
return node2;
}else if(null == node2){
return node1;
}else if(node1.val <= node2.val){
node1.next = mergeTwoList(node1.next,node2);
return node1;
}else {
node2.next = mergeTwoList(node1,node2.next);
return node2;
}
}
}
提交后 运行时间 4 ms 效率优化不少