解法一: 归并+递归,做这题之前先看BM4解发二比较好理解,时间复杂度nlog(n),空间复杂度O(n)
import java.util.*;
/**
* 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(ArrayList<ListNode> lists) {
if (lists == null || lists.size() == 0) {
return null;
}
return partion(lists, 0, lists.size() - 1);
}
private ListNode partion(ArrayList<ListNode> lists, int left, int right) {
if (left >= right) {
return lists.get(left);
}
int mid = (left + right) / 2;
ListNode node1 = partion(lists, left, mid);
ListNode node2 = partion(lists, mid + 1, right);
return merge(node1, node2);
}
private ListNode merge(ListNode node1, ListNode node2) {
if (node1 == null) {
return node2;
}
if (node2 == null) {
return node1;
}
ListNode pre = null;
if (node1.val < node2.val) {
pre = node1;
pre.next = merge(node1.next, node2);
} else {
pre = node2;
pre.next = merge(node1, node2.next);
}
return pre;
}
}
方法二:归并+循环,时间复杂度O(nlog(n)),空间复杂度O(n)
import java.util.*;
/**
* 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(ArrayList<ListNode> lists) {
if (lists == null || lists.size() == 0) {
return null;
}
return partion(lists, 0, lists.size() - 1);
}
private ListNode partion(ArrayList<ListNode> lists, int left, int right) {
if (left >= right) {
return lists.get(left);
}
int mid = (left + right) / 2;
ListNode node1 = partion(lists, left, mid);
ListNode node2 = partion(lists, mid + 1, right);
return merge(node1, node2);
}
private ListNode merge(ListNode list1, ListNode list2) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
ListNode cur = new ListNode(-1);
ListNode pre = cur;
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
cur.next = list1;
list1 = list1.next;
cur = cur.next;
} else if (list1.val > list2.val) {
cur.next = list2;
list2 = list2.next;
cur = cur.next;
} else {
cur.next = list1;
list1 = list1.next;
cur = cur.next;
cur.next = list2;
list2 = list2.next;
cur = cur.next;
}
}
while (list1 != null) {
cur.next = list1;
list1 = list1.next;
cur = cur.next;
}
while (list2 != null) {
cur.next = list2;
list2 = list2.next;
cur = cur.next;
}
return pre.next;
}
}