题解 |简单易懂! #合并k个已排序的链表#(Java)
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
这题主要是时间要少,然后节点的数据不大,我们可以用数组记录下每个节点val值-1000--1000出现的次数
数组下标是结点的值,数组的值是这个结点的值出现的次数。然后依次用节点链接起来就行了。
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) {
ArrayList<ListNode> list = new ArrayList<>();
int []valarry = new int[2002];
for(int i =0;i<lists.size();i++){
ListNode hands = lists.get(i);
while(true){
if(hands == null)
break;
if(hands.val<0){
valarry[0-hands.val]++;
}
if(hands.val==0){
valarry[1001]++;
}
if(hands.val>0){
valarry[hands.val+1001]++;
}
hands = hands.next;
}
}
ListNode node = new ListNode(1001);
ListNode hand = node;
for(int i =1000;i>=1;i--){
if(valarry[i]!=0){
for(int j=0;j<valarry[i];j++){
ListNode next = new ListNode(0-i);
node.next = next;
node = node.next;
}
}
}
for(int i =1001;i<valarry.length;i++){
if(valarry[i]!=0){
for(int j=0;j<valarry[i];j++){
ListNode next = new ListNode(i-1001);
node.next = next;
node = node.next;
}
}
}
return hand.next;
}
}
空间还有很大的优化,时间也还能再优化,这题比较水,就懒得再做了,哈哈哈。反正ac了-0-
