Leetcode148.排序链表——排序问题详解

2023-11-17

引入

148.排序链表题目如下:

148.排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5

题目要求时间空间复杂度分别为O(nlogn)和O(1),根据时间复杂度我们自然想到二分法,从而联想到归并排序。

归并排序解法

归并排序一般需要两步:

  1. sort阶段
  2. merge阶段

废话不多说sort如下代码所示:

public void sort(int[] arr, int L, int R) {
    if(L == R) {
        return;
    }
    int mid = L + ((R - L) >> 1);
    sort(arr, L, mid);
    sort(arr, mid + 1, R);
    merge(arr, L, mid, R);
}

不过本题难点在于:如何获取到mid? 链表的mid节点不能通过运算得来,我们想到以前的一个方法:快慢指针。

    public ListNode mergeSort(ListNode head) {
        //回归条件
        if (head.next == null) {
            return head;
        }
        //快指针,考虑到链表为2时的情况,fast比slow早一格
        ListNode fast = head.next;
        //慢指针
        ListNode slow = head;
        //快慢指针开跑
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //找到右子链表头元素,复用fast引用
        fast = slow.next;
        //将中点后续置空,切割为两个子链表
        slow.next=null;
        //递归分解左子链表,得到新链表起点
        head=mergeSort(head);
        //递归分解右子链表,得到新链表起点
        fast=mergeSort(fast);
        //并归两个子链表
        ListNode newHead = merge(head, fast);
//        ListNode.print(newHead);
        return newHead;
    }

这里还将listnode进行断链的处理,是真真正正的二分。以便于标记结束的节点是空。然后通过merge将两个链合成一个链即可。


接下来是merge阶段:
只需要用一个dummy来承接接下来的

    public ListNode merge(ListNode left, ListNode right) {
    	ListNode dummy=new ListNode(-1);
        ListNode temp = dummy;
        while (left != null && right != null) {
            //将较小的元素加入临时序列
            if (left.val <= right.val) {
                temp.next=left;
                left = left.next;
                temp = temp.next;
            } else {
                temp.next=right;
                right = right.next;
                temp = temp.next;
            }
        }
        //左子序列用完将右子序列余下元素加入临时序列
        if (left == null) {
            temp.next=right;
        }
        //右子序列用完将左子序列余下元素加入临时序列
        if (right == null) {
            temp.next=left;
        }
        return dummy.next;
    }

其他

在这里插入图片描述
上述排序算法,有机会再补充,这里由于快速排序在面试中用到的比较多,贴下代码:

public class test {
    public static void main(String[] args) {
        int[] arr=new int[]{113,223,52,12,543,322,110,6534,77,32,141};
        quickSort(arr,0,arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void quickSort(int[] arr,int left,int right){
        if(left<right){
            int mid=getIndex(arr,left,right);
            quickSort(arr,left,mid-1);
            quickSort(arr,mid+1,right);
        }
    }
    public static int getIndex(int[] arr,int left,int right){
        int temp=arr[left];
        while(left<right){
            while(left<right&&arr[right]>temp) right--;
            arr[left]=arr[right];
            while(left<right&&arr[left]<temp) left++;
            arr[right]=arr[left];
        }
        arr[left]=temp;
        return left;
    }
}

其他排序算法代码参考:十大排序算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode148.排序链表——排序问题详解 的相关文章

  • 230. Kth Smallest Element in a BST

    查找二叉搜索树的第K小节点 利用bst的中序遍历的性质 bst 中序遍历可以得到一个有序数组 每次从stack中弹出一个元素 看k 进行计数即可 Inorder Traversal We can inorder traverse the t

随机推荐

  • Spring系列文章:Spring中的设计模式

    一 简单 模式 BeanFactory的getBean 法 通过唯 标识来获取Bean对象 是典型的简单 模式 静态 模 式 二 法模式 FactoryBean是典型的 法模式 在配置 件中通过factory method属性来指定 法 该
  • Mac使用bootcamp安装win系统花屏解决方法

    15年11 乞丐版air装win屏幕花屏 很郁闷 先后找了网上很多方法 最终总结出了一个比较折中的方法 不玩游戏不使用大型3D的可以参考 1 花屏现象 2 解决方法 2 1 禁用驱动 2 2 使用Microsoft基本显示适配器 2 2 1
  • 记 asp.net core 开发过程中的错误

    mysql数据库 ef进行 update database 时 报 An error occurred using the connection to database on server localhost 3307 错误原因 serve
  • ctf.show web入门

    目录 信息收集 web1 where is flag web2 无法查看源代码 web3 where is flag web4 robots web5 phps文件泄露 web6 网站源码泄露 web7 git web8 svn泄露 web
  • 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 在这篇文章中 我们将使用 OpenCV 在图像的选定区域上应用 OCR 在本篇文章结束时 我们将能够对输入图像应用自动方向校正 选择感兴趣的区域并将OCR 应用到所选区域
  • tensorrt和onnxruntime-gpu同时调用gpu时tensorrt推理出现错乱解决方式

    问题 当我在同一个进程同时调用tensorrt和onnxruntime gpu时 出现了tensorrt推理结果全为0的情况 解决方式 将onnxruntime gpu放到cpu上 但是cpu的推理速度明显会不如gpu 如果在python中
  • 深度剖析数据在内存中的存储(修炼内力)

    目录 一 数据类型的介绍 1 1数据大小 1 2类型的基本归类 二 整型在内存中的存储 2 1原码 反码 补码 2 2大小端介绍 2 2 1大小端的起源 2 2 2大小端的概念 2 2 3为什么会有大端和小端 2 2 4设计一个小程序来判断
  • Fedora 启动顺序

    http hi baidu com wwwkljoel item 29620217882a585b2b3e2244 The start of the Fedora fedora 系统加电或复位后 中央处理器将内存中的所有数据清零 并对内存进
  • html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库

    由於每個部分的位置已經設置為relative 意味著將relative定位到上一節 因此可以將其他部分設置為left 0 margin 0 all sections display inline flex main about profes
  • 【学】saas系统前端技术选型,需要考虑哪些方面?

    对于saas前端技术选型 可以考虑以下几个方面 框架选择 目前比较流行的前端框架有React Vue Angular等 可以根据项目需求和团队技术水平选择合适的框架 例如 如果需要高度可定制性和灵活性 可以选择React 如果需要快速开发和
  • 数学建模之灰色关联实例含代码

    参考书籍 数学建模算法与应用 一 预备 1 无量纲化处理技术 二 灰色关联的步骤 通过对某健将级女子铅球运动员的跟踪调查 获得其 1982 年至 1986 年每年好成绩及16 项专项素质和身体素质的时间序列资料 见表 2 试对此铅球运动员的
  • linux-UNIX socket

    UNIX域套接字 域套接字作为进程间通信的一种手段 值得我们研究一下 域套接字实现本地进程间通信 同样有服务端和客户端之分 一个进程作为客户端 另一个进程作为服务端 这个和TCP socket类似 但是不一样 域套接字不经过底层网络 数据结
  • LaTeX 数学公式大全!

    LaTeX 数学公式大全 这里是来自一篇教程的截图 很全面
  • java.util之ArrayList使用

    java util之ArrayList使用 一 概述 ArrayList底层实际是通过一个数组来保存数据 其默认大小为10 扩容机制为新的容量 原始容量x3 2 1 允许空值 有序 为线程不安全 可以使用迭代器遍历 里面的的元素全部都是对象
  • NoteExpress安装时问题解决

    每次安装软件我都不能一次性成功 这次遇见的是NoteExpress和Word权限不一致的问题 版本 win10 office2019 网上有很多方法 其中CSDN博主 令令狐大侠 总结郭一篇 原文链接 https blog csdn net
  • 【华为OD机试】工号不够用了怎么办 (C++ Python Java)2023 B卷

    题目描述 3020年 空间通信集团的员工人数突破20亿人 即将遇到现有工号不够用的窘境 现在 请你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母 a z 和数字 0 9 两部分构成 新工号由一段英文字母开头 之后跟随一段数字
  • 关于split截取字符时,问号的特殊情况

    有一段字符 tring str gjjxxcx gjjxx cx jsp zgzh 1010024000019 如果使用如下代码 String strArray str split gjjxx cx jsp System out print
  • 基础算法题——带分数(全排列,工具库)

    前言 这道题理解起来不难 但是要找到一个合适的方法对题目进行优化 就会相对麻烦些 蓝桥杯的题 真的到处都是坑的感觉 带分数题目 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 100 可以表示为带分数的形式 100 3 6
  • 表单注入——sqli-labs第11~16关

    目录 第11关 0 万能账号 密码的前提 1 判断是否POST注入 2 猜测后台SQL语句 3 判断闭合符 4 查询列数 5 找显示位 6 查库名 7 查表名 8 查列名 9 找账号密码 第12关 第13关 第14关 1 2 3 4 5 6
  • Leetcode148.排序链表——排序问题详解

    文章目录 引入 归并排序解法 其他 引入 148 排序链表题目如下 148 排序链表 在 O n log n 时间复杂度和常数级空间复杂度下 对链表进行排序 示例 1 输入 4 gt 2 gt 1 gt 3 输出 1 gt 2 gt 3 g