题解 |简单易懂! #合并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-