合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。
解题思路:过程分为三步,第一步将排序过程分为左右两个部分,因此需要对链表分治,第二步在分治的链表内排序,第三步合并链表。时间复杂度在O(nlogk)
一刷没ac
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
public ListNode mergeKLists(List<ListNode> lists) {
if(lists == null || lists.size() == 0) return null;
return mergeHelper(lists, 0, lists.size()-1);
}
public ListNode mergeHelper(List<ListNode> lists, int start, int end){
if(start >= end) return lists.get(start);
int mid = (start + end) / 2;
ListNode left = mergeHelper(lists, start, mid);
ListNode right = mergeHelper(lists, mid+1, end);
return merge(left, right);
}
public ListNode merge(ListNode left, ListNode right){
if(left == null) return right;
if(right == null) return left;
ListNode dummy = new ListNode(0);
ListNode node = dummy;
while(left != null && right != null){
if(left.val > right.val){
ListNode tmp = right.next;
node.next = right;
node = node.next;
right = tmp;
}else{
ListNode tmp = left.next;
node.next = left;
node = node.next;
left = tmp;
}
}
if(left != null) node.next = left;
if(right != null) node.next = right;
return dummy.next;
}
}