LeetCode 腾讯精选50题--链表排序
解题思路:归并
先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置
合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位,一个移动一位,当移动快的结束时,慢的指针指向的位置就是链表的中间位置,
将中间位置往后的进行递归切割,然后将中间位置的下一个指针指向空,即断开链表,再对左边的子链进行递归。
边界条件就是当中间位置与起始位置重合时,就返回起始链表
代码如下:
 package algorithm;
 import basic.ListNode;
 public class SortLinkList {
     public ListNode sortList(ListNode head) {
         return sort(head,null);
     }
     private ListNode sort(ListNode head,ListNode middle) {
         if(head == null && middle == null){
             return null;
         }
         if(head == middle){
             return head;
         }
         ListNode fast = head;
         ListNode slow = head;
         while (fast != null && fast != middle && fast.next != middle){
             fast = fast.next.next;
             slow = slow.next;
         }
         ListNode subNode = slow;
         ListNode r = sort(slow.next,middle);
         subNode.next = null;
         ListNode l = sort(head,subNode);
         return merge(l,r);
     }
     private ListNode merge(ListNode left ,ListNode right){
         ListNode temp = new ListNode(0);
         ListNode record = temp;
         while (left != null && right!= null){
             if(left.val < right.val){
                 record.next = left;
                 left = left.next;
             }else {
                 record.next = right;
                 right = right.next;
             }
             record = record.next;
         }
         if(left != null){
             record.next = left;
         }else if(right!= null){
             record.next = right;
         }
         return temp.next;
     }
 }
但是由于只使用了一个空节点用于记录链表,所以空间复杂度为O(1) ,由于使用归并,时间复杂度为O(NlogN)。
LeetCode 腾讯精选50题--链表排序的更多相关文章
- LeetCode 腾讯精选50题--合并K个排序链表
		今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的: 1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作, 2.其次是多个链表的合并,所以在第一步实现的基础上 ... 
- LeetCode 腾讯精选50题--求众数
		由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ... 
- LeetCode 腾讯精选50题--数组中的第K个最大元素
		好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作. 找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以 ... 
- LeetCode 腾讯精选50题--二叉树中的最大路径和
		二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ... 
- LeetCode 腾讯精选50题--二叉树的最大深度
		求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ... 
- LeetCode 腾讯精选50题--2的幂
		在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ... 
- LeetCode 腾讯精选50题--只出现一次数字
		事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ... 
- LeetCode 腾讯精选50题--子集
		根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ... 
- LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II
		贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ... 
随机推荐
- C之内存地址
			计算机的内存地址 * 32位系统最多能识别4G内存 * 32位系统的地址总线长度是32位的,也就是说能分配给内存地址的数字是 2的32次方个 * 内存中每一个字节都需要一个内存地址 * 一个数字对用一 ... 
- Storm和Hadoop 区别
			Storm - 大数据Big Data实时处理架构 什么是Storm? Storm是:• 快速且可扩展伸缩• 容错• 确保消息能够被处理• 易于设置和操作• 开源的分布式实时计算系统- 最初由Na ... 
- c++ STL find search
			#include <iostream>#include <algorithm>#include <deque>#include <list>#inclu ... 
- Qt打开文件QFileDialog
			//打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ... 
- 阿里云轻量应用服务器 配置mysql详解(转载)
			1.服务器规格 1.地域选择 考虑个人地址因素因此选择了华南. 2.选择应用镜像/系统镜像 这个应该看个人需求,因为我只是想用来放数据库的,所以就随便选了个WordPress. 选好之后购买就完事了, ... 
- webpack 用 webpack-parallel-uglify-plugin 加速打包报错
			从新拉了份代码.npm install .npm run dev 都没有问题,但是npm run build 就报上面的错误了 查了好多资料,都没有解决上面的问题,也不知道是哪里出了问题,但是可以肯定 ... 
- mysql大数据量下优化
			1 优化sql和索引2 增加缓存如:redis3 主从复制或主主复制,读写分离4 利用mysql自带分区表5 先做垂直拆分,将一个大系统分为多个小系统,也就是分布式6 水平切分,要选择一个合理的sha ... 
- Jenkins之自动发送git变更到微信
			当我们通过Jenkins构建job的时候,是可以获取到git Change Log 的信息, 即本次上线修改了什么功能,我们将这个信息发送到微信群相关人员可直接获取到上线变更信息, 这样就不需要人为的 ... 
- Python的数据类型与数据结构
			Python的数据类型与数据结构 数据类型分为: 整数型 :数字的整数 浮点型: 数字带小数 字符串: 用 ‘’ 或者 “” 引用的任意文本 布尔型:只有 True 和 False 数据结构分为: 列 ... 
- mysql查看数据库所占用的空间
			查询某个表所占用的磁盘空间大小: SELECT CONCAT(ROUND(SUM(data_length/1024/1024),2),'MB') AS data_length_MB, CONCAT(R ... 
