目录
- 1- 思路
- 优先队列
- 2- 实现
- ⭐23. 合并 K 个升序链表——题解思路
- 3- ACM 实现
- 原题连接:23. 合并 K 个升序链表
1- 思路
优先队列
- 1- 提供的数据结构:
ListNode[] lists
- 2- 由于提供的数据结构已经是有序的,不能通过指针实现是因为不知道一共要定义多少个指针来遍历链表
- 3- 所以引出优先队列解决,将链表的数据加入 优先队列,实现排序
实现思路
PriorityQueue<ListNode> pq = new PriorityQueue<>(len,Comparator.comparingInt(a -> a.val));
- 上述操作实际上实现了一个最小堆,每次弹出的是一个堆顶元素。
- 如果定义的是升序优先队列,则其弹出
poll
的时候,始终是最小的元素先弹出``
2- 实现
⭐23. 合并 K 个升序链表——题解思路
class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode dummyHead = new ListNode(-1);ListNode cur = dummyHead;// 定义长度int len = lists.length;if(len==0){return null;}// 1.优先队列PriorityQueue<ListNode> pq = new PriorityQueue<>(len,Comparator.comparingInt(a -> a.val));// 2.先加入头for(ListNode list:lists){if(list!=null){pq.add(list);}}// 3. 处理弹出逻辑while(!pq.isEmpty()){cur.next = pq.poll();cur = cur.next;if(cur.next!=null){pq.add(cur.next);}}return dummyHead.next;}
}
3- ACM 实现
public class mergeKLists {public static class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}}public static ListNode mergKLists(ListNode[] lists){// 1. 求长度int len = lists.length;if(len==0){return null;}// 1. 定义 pqPriorityQueue<ListNode> pq = new PriorityQueue<>(len, Comparator.comparingInt(a -> a.val));// 2.处理头for(ListNode list:lists){if(list!=null){pq.add(list);}}ListNode dummyHead = new ListNode(-1);ListNode cur = dummyHead;// 3. 处理pqwhile(!pq.isEmpty()){cur.next = pq.poll();cur = cur.next;if(cur.next!=null){pq.add(cur.next);}}return dummyHead.next;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("数组长度");int k = scanner.nextInt();ListNode[] lists = new ListNode[k];for (int i = 0; i < k; i++) {System.out.println("输入链表长度");int n = scanner.nextInt();if (n == 0) {lists[i] = null;} else {lists[i] = new ListNode(scanner.nextInt());ListNode current = lists[i];for (int j = 1; j < n; j++) {current.next = new ListNode(scanner.nextInt());current = current.next;}}}ListNode forRes = mergKLists(lists);while(forRes!=null){System.out.print(forRes.val+" ");forRes = forRes.next;}}
}