Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
递归归并
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if (lists == null || lists.size() < 1) {
return null;
}
if (lists.size() == 1) {
return lists.get(0);
}
List<ListNode> llists = new ArrayList<ListNode>();
for (int i = 0; i < lists.size() / 2; i++) {
llists.add(lists.get(i));
}
List<ListNode> rlists = new ArrayList<ListNode>();
for (int i = lists.size() / 2; i < lists.size(); i++) {
rlists.add(lists.get(i));
}
ListNode left = mergeKLists(llists);
ListNode right = mergeKLists(rlists);
return merge(left, right);
}
private ListNode merge(ListNode left, ListNode right) {
if (left == null) {
return right;
}
if (right == null) {
return left;
}
ListNode p1 = left;
ListNode p2 = right;
ListNode head = new ListNode(0);
ListNode cur = head;
while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
cur.next = p1;
p1 = p1.next;
} else {
cur.next = p2;
p2 = p2.next;
}
cur = cur.next;
}
if (p1 != null) {
p2 = p1;
}
while (p2 != null) {
cur.next = p2;
cur = cur.next;
p2 = p2.next;
}
return head.next;
}
}