你管这叫困难??
一看数据范围就1e4,直接开2e4的数组存一下各个值的数量
然后拼一下就完事了
(一看官方题解就知道,果然正规解法没那么简单,不过分治或优先队列的做法也挺简单的)
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int[] nums = new int[20001];
for (ListNode list : lists) {
while (list != null) {
int val = list.val;
if (val < 0) {
nums[-val + 10000]++;
} else {
nums[val]++;
}
list = list.next;
}
}
ListNode ans = new ListNode();
ListNode front = ans;
for (int i = 20000; i >= 10001; i--) {
for (int j = 0; j < nums[i]; j++) {
ans.next = new ListNode(-i + 10000);
ans = ans.next;
}
}
for (int i = 0; i <= 10000; i++) {
for (int j = 0; j < nums[i]; j++) {
ans.next = new ListNode(i);
ans = ans.next;
}
}
return front.next;
}
}
2022/3/12补充优先队列写法
/**
* 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 {
class Node {
ListNode node;
int index;
public Node(ListNode node, int index) {
this.node = node;
this.index = index;
}
}
public ListNode mergeKLists(ListNode[] lists) {
int len = lists.length;
ListNode ans = new ListNode();
ListNode temp = ans;
PriorityQueue<Node> pq = new PriorityQueue<>(new Comparator<Node>() {
@Override
public int compare(Node a, Node b) {
return a.node.val - b.node.val;
}
});
for(int i = 0;i < len;i++) {
if(lists[i] != null) {
pq.add(new Node(lists[i], i));
}
}
while(!pq.isEmpty()) {
Node top = pq.poll();
temp.next = top.node;
temp = temp.next;
if(top.node.next != null) {
pq.add(new Node(top.node.next, top.index));
}
}
return ans.next;
}
}