import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param lists ListNode类一维数组 * @return ListNode类 */ public ListNode mergeKLists (ListNode[] lists) { if (lists == null || lists.length == 0) return null; PriorityQueue<ListNode> listNodes = new PriorityQueue<>(lists.length, new Comparator<ListNode>() { @Override public int compare(ListNode o1, ListNode o2) { return o1.val - o2.val; } }); for (ListNode list : lists) { if (list != null) { listNodes.add(list); } } // 初始化一个虚拟头结点 ListNode resultNode = new ListNode(-1); ListNode temp = resultNode; while (!listNodes.isEmpty()) { ListNode node = listNodes.poll(); if (node.next != null) { listNodes.add(node.next); } temp.next = node; temp = temp.next; } return resultNode.next; } }
本题知识点分析:
1.链表遍历
2.链表赋值
3.前驱节点和后继结点
4.优先级队列的自定义排序
5.虚拟头结点
本题解题思路分析:
1.利用优先级队列进行升序排序
2.先取出所有的不为null的节点,加入到容器中,边加入边排序
3.当容器不为空时,从容器头部取出一个结点,如果该结点.next!=null说明还有下一个节点,将下一个节点地址加入到容器,自动排序
4.temp.next指向取出来的node比如第一个1
5.节点后移,用来继续连接结点
6.最后返回头结点的.next也就是第一个结点,虚拟结点是为了防止移动后,无法返回的情况。