leetcode-23. Merge k Sorted Lists
阿新 • • 發佈:2018-11-21
題目型別:
連結串列、分治、歸併
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;
}
}