You are given an array of k
linked-lists lists
, each linked-list is sorted in ascending order.
Merge all the linked-lists into one sorted linked-list and return it.
Example 1:
Input: lists = [[1,4,5],[1,3,4],[2,6]] Output: [1,1,2,3,4,4,5,6] Explanation: The linked-lists are: [ 1->4->5, 1->3->4, 2->6 ] merging them into one sorted list: 1->1->2->3->4->4->5->6
Example 2:
Input: lists = [] Output: []
Example 3:
Input: lists = [[]] Output: []
Constraints:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
is sorted in ascending order.- The sum of
lists[i].length
won't exceed10^4
.
题目链接:https://leetcode.com/problems/merge-k-sorted-lists/
题目大意:合并多个排序链表
题目分析:直接暴力
338ms,时间击败5%
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode helper = new ListNode();
ListNode head = helper;
while(true) {
int mi = Integer.MAX_VALUE;
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null) {
mi = Math.min(lists[i].val, mi);
}
}
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null && lists[i].val == mi) {
lists[i] = lists[i].next;
break;
}
}
if (mi == Integer.MAX_VALUE) {
break;
} else {
head.next = new ListNode(mi);
head = head.next;
}
}
return helper.next;
}
}
分治
5ms,时间击败60%
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwo(ListNode a, ListNode b) {
ListNode helper = new ListNode();
ListNode head = helper;
while (a != null && b != null) {
if (a.val <= b.val) {
head.next = new ListNode(a.val);
a = a.next;
} else {
head.next = new ListNode(b.val);
b = b.next;
}
head = head.next;
}
if (a != null) {
head.next = a;
}
if (b != null) {
head.next = b;
}
return helper.next;
}
public ListNode divide(ListNode[] lists, int l, int r) {
if (l == r) {
return lists[l];
}
int mid = (l + r) >> 1;
ListNode left = divide(lists, l, mid);
ListNode right = divide(lists, mid + 1, r);
return mergeTwo(left, right);
}
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
if (lists.length == 1) {
return lists[0];
}
return divide(lists, 0, lists.length - 1);
}
}