当前位置: 首页 > news >正文

天津市住房和城乡建设厅官方网站建筑管理招聘网

天津市住房和城乡建设厅官方网站,建筑管理招聘网,苏州网站开发培训班,经常使用什么对网页的布局进行控制文章目录 一、前言二、最小堆解法三、分治解法 一、前言 23. 合并 K 个升序链表 本题的要求是把K个链表进行合并,合并后的链表必须是从小到大的。 并且这K个链表也是从小到大的升序链表。 二、最小堆解法 既然每个链表都是升序的,也就是从小到大的。 …

文章目录

  • 一、前言
  • 二、最小堆解法
  • 三、分治解法

一、前言

23. 合并 K 个升序链表

本题的要求是把K个链表进行合并,合并后的链表必须是从小到大的。

并且这K个链表也是从小到大的升序链表。


二、最小堆解法

既然每个链表都是升序的,也就是从小到大的。

那么最后合并出来的链表的第一个节点,也肯定是K个链表的某个链表(记做first链表)第一个节点的其中一个。

合并之后的第二个节点,可以是其余链表的第一个节点或是first链表的第二个节点。

抓住这个规律,我们只需要每次收集每个链表的第一个节点,然后进行排序,取最小那个节点进行合并即可。

如果某个链表的第一个节点已经合并了,那么取第二个。如果第二个也合并了,那么取第三个。以此类推!

这里的话就可以考虑使用最小堆来完成这个排序工作,只需要把节点入堆,然后弹出堆中的最小堆即可。

思路如下:

  1. 初始化堆,将K个链表的第一个节点入堆
  2. 不断弹出最小堆,直到堆为空为止
    • 对弹出的节点进行合并,如果弹出节点的next不为空,继续将节点的next入堆
public ListNode mergeKLists(ListNode[] lists) {PriorityQueue<ListNode> queue = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);for (ListNode head : lists) {if (head != null){queue.add(head);}}ListNode head = new ListNode();ListNode p0 = head;while (!queue.isEmpty()){ListNode node = queue.poll();p0.next = node;p0 = p0.next;if (node.next != null){queue.add(node.next);}}return head.next;
}
  • 时间复杂度: O(nlog⁡k),其中n为链表总数,k为链表的数量。前面初始化堆的时间复杂度为O(k),合并链表的时候,从堆中取出最小堆的时间复杂度O(logk),链表总数为n,链表的所有节点都会放进堆中,因此从堆中取最小堆这个操作需要执行n次,因此时间复杂度为O(nlog⁡k)
  • 空间复杂度:O(k),堆中最多存放k个元素。

三、分治解法

分治的思路就是将一个问题拆分成多个子问题,最后将所有子问题进行合并,从而解决问题。

于是我们可以将k个链表分成两个部分,分别为前半部分链表和后半部分链表,先分别对前半部分链表和后半部分链表进行合并成两个升序的链表,然后对升序的两个链表进行合并。

要对前半部分链表和后半部分链表分别合并成两个升序链表,可以继续对这两部分链表进行拆分,一分为二,直到只有一个链表,那就不需要合并了。

因此需要用递归了解决问题

public ListNode mergeKLists(ListNode[] lists) {return mergeKLists(lists, 0, lists.length);
}private ListNode mergeKLists(ListNode[] lists, int i, int j) {int m = j - i;if (m == 0) {return null;}if (m == 1) {return lists[i];}ListNode left = mergeKLists(lists, i, i + m / 2);ListNode right = mergeKLists(lists, i + m / 2, j);return mergeKTwoLists(left, right);
}private ListNode mergeKTwoLists(ListNode left, ListNode right) {ListNode head = new ListNode(-1, null);ListNode p0 = head;while (left != null && right != null) {if (left.val > right.val) {p0.next = right;right = right.next;} else {p0.next = left;left = left.next;}p0 = p0.next;}if (left != null){p0.next = left;}if (right != null){p0.next = right;}return head.next;
}
  • 时间复杂度:O(nlogk)。n为链表总数,k为链表数量。分治的时间复杂度为O(logk),每个节点都要参与一次合并,那么就是O(nlogk).
  • 空间复杂度:O(logk)。递归深度为 O(logk),需要用到 O(logk) 的栈空间。
http://www.yayakq.cn/news/708393/

相关文章:

  • 网站建设怎么放到云空间网络营销市场调研的优势有
  • 做一个卖车的网站该怎么做常州网站价格
  • 华北理工大学学科建设处网站网站要精细是什么意思
  • 天津建设工程交易中心网站上海建设银行官网网站6
  • 网站互动怎么做北京最大的广告公司
  • 什么网站可以免费做试卷在线流程图制作
  • 网站建设最重要的是什么网站建设推广图片
  • 欧美做爰爰爰爰网站查询关键词排名工具
  • 舞蹈网站建设报价91色做爰网站
  • 网站建设介绍书软件设计方案怎么写
  • 自助建站平台物流网站哪个好
  • 网站建设 公司 广州网站定位策划
  • 推荐一些做电子的网站设置网站域名
  • 北京网站建设公司兴田德润专业wordpress主题 ux
  • 大连网站建设推广北京广告公司
  • 公司网站开发公司南京网站制作平台
  • 网站开发与推广微商城网站建设
  • 网站出租目录做菠菜 有什么坏处老域名重新做网站
  • 重启 iis 中的网站wordpress 5.2 5.3
  • 云南网站建设产品介绍网站有了订单邮箱提醒代码
  • 郑州网站建设快速排名熊掌海外推广运营
  • 培训网站方案铜仁网站建设哪家专业
  • 网站设计风格有哪些茶叶网站建设策划方案 u001f
  • 网站开发英语词汇网站开发新闻管理系统的背景
  • 免费信息网站建设平台国微 网站建设
  • 广州网站建设的费用网站开发与维护是学什么
  • 网站建设的设计与实现wordpress快递主题
  • 网站开发写好了怎么发布商城网站建设制作设计
  • 漯河网站建设-千弘网络公众号怎么制作链接
  • 长网址转短网址网站wordpress 多栏主题