题目类型:
链表、分治、归并
21题的变式
题意:
合并k个已排序的链表
解法一:暴力–错误
- 复杂度O(k^2^ * N)
类似两个链表的合并,第一个节点全部对比,小的取出,指针后移,再比较。。。。
解法二:暴力
- 遍历k个链表,将节点全部添加至集合,对集合排序。
解法三:分治–归并排序
复杂度O(kNlogN)
- 两个链表排序
- 四个链表
- 8个。。
- 。。。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int len = lists.length;
if (len == 0) {
return null;
}
return mergerSort(lists, 0, len - 1);
}
private ListNode mergerSort(ListNode[] lists, int left, int right) {
if (left == right) {
return lists[left];
}
else if (left < right) {
int mid = left + (right - left) / 2;
ListNode first = mergerSort(lists, left, mid);
ListNode second = mergerSort(lists, mid + 1, right);
return mergeTwoLists(first, second);
}
return null;
}
private ListNode mergeTwoLists(ListNode a, ListNode b) {
ListNode node = new ListNode(0);
ListNode copy = node;
while (a != null && b != null) {
if(a.val <= b.val){
node.next = a;
a = a.next;
}
else {
node.next = b;
b = b.next;
}
node = node.next;
}
if (a != null) {
node.next = a;
}
else if(b != null){
node.next = b;
}
return copy.next;
}
}