leetcode **23. 合并K个升序链表(2020.4.26)
【题目】**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 条链表
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】逐一合并
//迭代
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)相关推荐
- [分治] leetcode 23 合并K个升序链表
[分治] leetcode 23 合并K个升序链表 1.题目 题目链接 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例1: 输入:lists ...
- LeetCode 23合并K个升序链表24两两交换链表中的节点
维护不易,点赞再看,感谢支持 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1 ...
- 82. Leetcode 23. 合并K个升序链表 (排序)
给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...
- Leetcode 23 合并k个升序链表 (每日一题 20210722)
给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...
- LeetCode 23 合并K个升序链表
https://leetcode-cn.com/problems/merge-k-sorted-lists/ 解决方案 import java.util.Comparator; import java ...
- 【LeetCode】【HOT】23. 合并K个升序链表(递归+分治)
[LeetCode][HOT]23. 合并K个升序链表 文章目录 [LeetCode][HOT]23. 合并K个升序链表 package hot;import java.util.Arrays;cla ...
- LeetCode 23. 合并K个排序链表(优先队列)
文章目录 1. 题目信息 2. 思路 3. 代码 1. 题目信息 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例:输入: [1->4->5,1->3-& ...
- 优先队列之Leetcode 23合并K个有序链表
优先队列要点复习 这在之前专门写过一篇文章讲优先队列的使用方法: 优先队列的优先级设置法 对于优先队列,我们首先需要知道,它的底层是堆,或者说优先队列是堆的一种别称.堆自然就分成了两个方向: 大顶堆 ...
- 力扣 23. 合并K个升序链表
题目 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1, ...
最新文章
- sqlserver中,如果正确得到中文的长度
- java平均差_如何做好描述统计分析
- 电子设计竞赛(三)-SPWM与PID
- 论文阅读(4)--Part-Stacked CNN for Fine-Grained Visual Categorization
- java怎吗从磁盘读文件_编写一个Java应用程序,该程序使用FileInputStream类,实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。...
- 【JAVA基础篇】运算符
- heatmap个人简单理解
- 什么是 Stack Overflow,什么情况下会造成 Stack Overflow
- 查看window重启日志
- who I am ?
- scrum开发中测试人员如何工作?
- 1-5Badboy添加检查点和参数化
- java入门-dos窗口的用法
- 充分统计(sufficient statistic) 理解
- 模型笔记1---3d max 导入obj模型设置
- python软件操作步骤_python+pywinauto C/S架构软件基本操作
- 听说CDN高防和高防IP是服务器安全的“翘楚”,那么你知道这二者的区别吗?
- cubemx 配置多通道ADC进行ADC采样
- GP2Y0A21YK0F距离传感器输出特性分析及其使用(IIC总线与PCF8591AD转换)+Proteus仿真(附源码)
- 1688、淘宝、拼多多的商品类目包、上传类目包