方法1:使用优先队列合并
方法2:分治法,两两合并
代码1:优先队列
class Solution { public ListNode mergeKLists(ListNode[] lists) { /** * 方法1:使用优先队列 * 把链表的头结点都放进去,然后出队当前优先队列中最小的,接上链表,, * 然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。 * 注意:优先队列中不能出现 null,要对 null 进行判断 */ if (lists == null || lists.length == 0) return null; ListNode dummyHead = new ListNode(-1); ListNode cur = dummyHead; PriorityQueue<ListNode> minHeap = new PriorityQueue<>((o1, o2) -> o1.val - o2.val); for (ListNode head : lists) { if (head != null) { // 注意 minHeap.add(head); } } while (!minHeap.isEmpty()) { ListNode temp = minHeap.poll(); if (temp.next != null) { // 注意,如果某个链表遍历完了 minHeap.add(temp.next); } cur.next = temp; cur = cur.next; } return dummyHead.next; } }
代码2:分治法
M