今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的:

  1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作,

  2.其次是多个链表的合并,所以在第一步实现的基础上,我考虑每次选择两个链表进行合并,一个链表数组作为一个整体,那么就可以采用归并算法进行合并,利用两个指针分别指向当前的数组位置,不断切分直到指针指向一个位置,再返回,然后进行合并,由于递归的操作,可以保证每次合并时只会有两个排序好的链表。

所以这辆的关键就是要搞清楚怎么递归去合并两个链表,以及如何递归合并一个大的数组

如下是代码:

 package algorithm;

 public class RecursiveSort {

     public ListNode mergeKLists(ListNode[] lists) {
if(lists.length < 1){
return null;
} return merge(lists,0,lists.length-1);
} private ListNode merge(ListNode[] lists,int left,int right){ if(left >= right){
return lists[left];
}
int center = (left+right)/2; ListNode leftNode = merge(lists,left,center);
ListNode rightNode = merge(lists,center+1,right); ListNode temp = new ListNode();
temp = mergeTwoListNode2(leftNode,rightNode,temp); return temp; } /**
* 递归合并
* @param l1
* @param l2
* @param temp
* @return
*/
private ListNode mergeTwoListNode2(ListNode l1,ListNode l2,ListNode temp){
if(l1 == null || l2 == null){
if(l1 == null && l2 == null){
return l1; //边界情况返回哪个都是可以的
}else {
temp = l1 == null ? l2 : l1;
} return temp;
} if(l1.val > l2.val){
temp = l2;
temp.next = mergeTwoListNode2(l1,l2.next,temp.next);
}else {
temp = l1; temp.next = mergeTwoListNode2(l1.next,l2,temp.next);
} return temp; } }

最后说实话,对于递归我还是没有搞明白,这道题也算是稀里糊涂的就完成了,但是个人认为比较重要的一点是先做好简单的,也就是先把两个链表的合并解决了,那剩下多个链表的合并就可以转变为多次 两个链表的合并这一步骤

LeetCode 腾讯精选50题--合并K个排序链表的更多相关文章

  1. LeetCode 腾讯精选50题--数组中的第K个最大元素

    好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作. 找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以 ...

  2. LeetCode 腾讯精选50题--2的幂

    在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...

  3. LeetCode 腾讯精选50题--链表排序

    解题思路:归并 先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置 合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位 ...

  4. LeetCode 腾讯精选50题--二叉树中的最大路径和

    二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...

  5. LeetCode 腾讯精选50题--二叉树的最大深度

    求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...

  6. LeetCode 腾讯精选50题--求众数

    由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...

  7. LeetCode 腾讯精选50题--只出现一次数字

    事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...

  8. LeetCode 腾讯精选50题--子集

    根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...

  9. LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

    贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...

随机推荐

  1. Android:cmake开发指南

    一.静态库与动态库构建 (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行. (.a)静态库,archive:静态库和程序化为一体,不会分开 ...

  2. GradientDrawable

    一个具有渐变区域的Drawable,可以实现线性渐变,发散渐变和平铺渐变效果 核心节点:<gradient/>,有如下可选属性: startColor:渐变的起始颜色 centerColo ...

  3. 009-DNS域名解析系统

    一.概述 DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务.域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在I ...

  4. WebSphere 安装部署,发布web应用

    转: WebSphere 安装部署,发布web应用 2017年11月20日 23:51:08 greensure 阅读数 20099   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权 ...

  5. [idea][转]理解 IntelliJ IDEA 的项目配置和Web部署

    1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...

  6. java+大文件分段上传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  7. Telegram Groups vs Telegram Channels

    Telegram Groups vs Telegram Channels By Iaroslav Kudritskiy  Unlike other messaging apps, using Tele ...

  8. 解决zabbix中文乱码问题

    进入Windows系统控制面板-->外观和个性化-->字体(选择一个字体文件simsun.ttc复制)进入zabbix的web服务器[root@test-zabbix]# cd ~/zab ...

  9. 神经网络与数字货币量化交易系列(1)——LSTM预测比特币价格

    首发地址:https://www.fmz.com/digest-topic/4035 1.简单介绍 深度神经网络这些年越来越热门,在很多领域解决了过去无法解决的难题,体现了强大的能力.在时间序列的预测 ...

  10. 【VS开发】QueryPerformanceFrequency与QueryPerformanceCounter的使用

    LARGE_INTEGER tima,timb; QueryPerformanceCounter(&tima); 在 Windows Server 2003 和 WindowsXP 中使用 Q ...