【题目】**23. 合并K个升序链表

21.合并两个有序链表
**23. 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:

输入:
[1->4->5,1->3->4,2->6
]
输出: 1->1->2->3->4->4->5->6

【解题思路1】暴力法

转化为数组,排序后在转化为链表

class Solution {public ListNode mergeKLists(ListNode[] lists) {int num = 0;//记录一共有多少个元素,以便确定创建数组的大小for (ListNode node : lists) {while (node != null) {num++;node = node.next;}}//O(nk)的复杂度,k为链表个数,n为假设每个链表长度都为nint[] list = new int[num];int i = 0;//装入数组 O(nk)for (ListNode node : lists) {while (node != null) {list[i] = node.val;node = node.next;i++;}}//排序 O(nklog(nk))Arrays.sort(list);if (list.length==0)return null;ListNode ans = new ListNode(list[0]);ListNode head = ans;//装回链表O(nk)for (int k = 1; k < num; ++k) {ans.next = new ListNode(list[k]);ans = ans.next;}return head;}
}

【解题思路2】K 指针:K 个指针分别指向 K 条链表

每次从k个链表中找出最小值结点接到答案后面

class Solution {public ListNode mergeKLists(ListNode[] lists) {int len = lists.length;ListNode dummy = new ListNode(0);ListNode tail = dummy;while(true){ListNode minNode = null;int min = -1;//遍历列表for(int i = 0; i<len; i++){if(lists[i] == null){continue;}//记录最小值以及其位置if(minNode == null || lists[i].val < minNode.val){minNode = lists[i];min = i;}}//没有结点了,结束循环if(min == -1){break;}//将这一轮找到的最小值结点接到答案后面tail.next = minNode;tail = tail.next;lists[min] = lists[min].next; //原链后移}return dummy.next;}
}

【解题思路3】逐一合并

21.合并两个有序链表

//迭代
class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode res = null;for(ListNode list : lists){res = merge(res, list);}return res;}public ListNode merge(ListNode l1, ListNode l2){ListNode dummy = new ListNode(0);ListNode tail = dummy;while(l1 != null && l2 != null){if(l1.val < l2.val){tail.next = l1;l1 = l1.next;}else{tail.next = l2;l2 = l2.next;}tail = tail.next;}tail.next = l1 == null ? l2 : l1;return dummy.next;}
}
//递归
class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode res = null;for(ListNode list : lists){res = merge(res, list);}return res;}public ListNode merge(ListNode l1, ListNode l2){ListNode dummy = new ListNode(0);ListNode tail = dummy;while(l1 != null && l2 != null){if(l1.val < l2.val){tail.next = l1;l1 = l1.next;}else{tail.next = l2;l2 = l2.next;}tail = tail.next;}tail.next = l1 == null ? l2 : l1;return dummy.next;}
}

【解题思路4】递归两两合并

//递归
class Solution {public ListNode mergeKLists(ListNode[] lists) {if(lists.length == 0){return null;}return mergeList(lists, 0, lists.length - 1);}public ListNode mergeList(ListNode[] lists, int left, int right){if(left == right){return lists[left];}int mid = left + (right - left) / 2;ListNode l1 = mergeList(lists, left, mid);ListNode l2 = mergeList(lists, mid + 1, right);return merge(l1, l2);}public ListNode merge(ListNode l1, ListNode l2){if(l1 == null){return l2;}if(l2 == null){return l1;}if(l1.val < l2.val){l1.next = merge(l1.next, l2);return l1;}l2.next = merge(l1, l2.next);return l2;}
}
//迭代
class Solution {public ListNode mergeKLists(ListNode[] lists) {if(lists.length == 0){return null;}int k = lists.length;while(k > 1){int idx = 0;for(int i = 0; i < k; i += 2){if(i == k - 1){lists[idx++] = lists[i];}else{lists[idx++] = merge(lists[i], lists[i+1]);}}k = idx;}return lists[0];}public ListNode merge(ListNode l1, ListNode l2){if(l1 == null){return l2;}if(l2 == null){return l1;}if(l1.val < l2.val){l1.next = merge(l1.next, l2);return l1;}l2.next = merge(l1, l2.next);return l2;}
}

leetcode **23. 合并K个升序链表(2020.4.26)相关推荐

  1. [分治] leetcode 23 合并K个升序链表

    [分治] leetcode 23 合并K个升序链表 1.题目 题目链接 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例1: 输入:lists ...

  2. LeetCode 23合并K个升序链表24两两交换链表中的节点

    维护不易,点赞再看,感谢支持 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1 ...

  3. 82. Leetcode 23. 合并K个升序链表 (排序)

    给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...

  4. Leetcode 23 合并k个升序链表 (每日一题 20210722)

    给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...

  5. LeetCode 23 合并K个升序链表

    https://leetcode-cn.com/problems/merge-k-sorted-lists/ 解决方案 import java.util.Comparator; import java ...

  6. 【LeetCode】【HOT】23. 合并K个升序链表(递归+分治)

    [LeetCode][HOT]23. 合并K个升序链表 文章目录 [LeetCode][HOT]23. 合并K个升序链表 package hot;import java.util.Arrays;cla ...

  7. LeetCode 23. 合并K个排序链表(优先队列)

    文章目录 1. 题目信息 2. 思路 3. 代码 1. 题目信息 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例:输入: [1->4->5,1->3-& ...

  8. 优先队列之Leetcode 23合并K个有序链表

    优先队列要点复习 这在之前专门写过一篇文章讲优先队列的使用方法: 优先队列的优先级设置法 对于优先队列,我们首先需要知道,它的底层是堆,或者说优先队列是堆的一种别称.堆自然就分成了两个方向: 大顶堆 ...

  9. 力扣 23. 合并K个升序链表

    题目 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1, ...

最新文章

  1. sqlserver中,如果正确得到中文的长度
  2. java平均差_如何做好描述统计分析
  3. 电子设计竞赛(三)-SPWM与PID
  4. 论文阅读(4)--Part-Stacked CNN for Fine-Grained Visual Categorization
  5. java怎吗从磁盘读文件_编写一个Java应用程序,该程序使用FileInputStream类,实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。...
  6. 【JAVA基础篇】运算符
  7. heatmap个人简单理解
  8. 什么是 Stack Overflow,什么情况下会造成 Stack Overflow
  9. 查看window重启日志
  10. who I am ?
  11. scrum开发中测试人员如何工作?
  12. 1-5Badboy添加检查点和参数化
  13. java入门-dos窗口的用法
  14. 充分统计(sufficient statistic) 理解
  15. 模型笔记1---3d max 导入obj模型设置
  16. python软件操作步骤_python+pywinauto C/S架构软件基本操作
  17. 听说CDN高防和高防IP是服务器安全的“翘楚”,那么你知道这二者的区别吗?
  18. cubemx 配置多通道ADC进行ADC采样
  19. GP2Y0A21YK0F距离传感器输出特性分析及其使用(IIC总线与PCF8591AD转换)+Proteus仿真(附源码)
  20. 1688、淘宝、拼多多的商品类目包、上传类目包

热门文章

  1. chrome浏览器network报错:ERR_CERT_AUTHORITY_INVALID
  2. C4D阿诺德渲染器:C4DtoA for Cinema 4D S24 mac版
  3. 2022年度国家级科技企业孵化器开始申报
  4. 【产品】产品认证项目
  5. Oracle 相关认证证书查询及真伪辨别
  6. 第三代移动通信(3G时代)(
  7. 3G时代,我们到底该选择谁?
  8. 动漫配音是怎么制作出来的?除了自己配,还有一个小方法
  9. amd 开核型号及匹配主板
  10. Tomcat 程序中远程部署