标签:node pq ListNode val next 链表 升序 leetcode
题目:23. 合并K个升序链表 - 力扣(LeetCode) (leetcode-cn.com)
思路:
合并k个链表和合并2个链表的逻辑类似,都是迭代以此比较两个链表上的元素,取出小的节点加入合并的链表。
但是合并k个链表难点在于如何获得k链表的最小值,此时引入一个优先级队列,其实是一个最小堆,就可以每次获得k个节点的最小值
优先级队列使用方法如下,可以搭配比较函数使用
数据结构之优先队列(最小堆)_追忆似水_年华的博客-CSDN博客_优先队列最小堆
算法
1.新建一个优先级队列pq,比较规则以节点的元素大小按从小到大的最小堆,保证每次取出来的值是最小值
2.创建合并链表的虚拟头节点
ListNode dumpy = new ListNode(-1); ListNode p = dumpy;
3.先将不是空链表的头节点加入最小堆中
如果最小堆不为空:
4.从最小堆中拿出最小值加到合并的链表中node = pq.poll(),p.next = node;
4.1 拿出后node,如果node.next不为null,说明所在的链表此时还有数据,应该将下一个节点node.next再加入到最小堆中,
4.2 如果node所在的链表此时没有数据,说明这个链表的已经全部加入合并链表中,此时只需要比较其余节点
如果最小堆为空:
则说明所有数据都已经加入合并链表中了
代码如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { // 优先队列中是不允许传null,长度不能传0,因此需要单独判断 if (lists.length == 0) return null; ListNode dumpy = new ListNode(-1); ListNode p = dumpy; // 最小堆:根据元素大小,从小到大 PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length,(a,b) -> (a.val - b.val)); for(ListNode head : lists){ if(head!=null){ pq.add(head); } } while(!pq.isEmpty()){ // 拿出当前所有链表所有节点的最小值 ListNode node = pq.poll(); p.next = node; if(node.next != null){ pq.add(node.next); } p = p .next; } return dumpy.next; } }
标签:node,pq,ListNode,val,next,链表,升序,leetcode
来源: https://www.cnblogs.com/xiangshigang/p/16210752.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。