排序链表00

news2024/12/23 13:28:54

题目链接

排序链表

题目描述


注意点

  • 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序

解答思路

  • 使用归并排序对链表进行排序,保证时间复杂度为 O(n log n)
  • 相对于数组的归并排序,链表的中间节点需要遍历才能找到,所以需要先找到链表的长度,再根据长度找到中间节点,分别对左右两段链表内部进行排序,内部排序完成后再将两段链表整体进行排序

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        int len = 0;
        ListNode node = head;
        while (node != null) {
            len++;
            node = node.next;
        }
        return mergeList(head, len);
    }

    private ListNode mergeList(ListNode head, int len) {
        if (len <= 1) {
            return head;
        }
        int mid = len / 2;
        ListNode tmp = head;
        for (int i = 0; i < mid - 1; i++) {
            tmp = tmp.next;
        }
        // 另一段的头节点
        ListNode midNode = tmp.next;
        // 将两段分割
        tmp.next = null;
        ListNode node1 = mergeList(head, mid);
        ListNode node2 = mergeList(midNode, len - mid);
        return merge(node1, node2);
    }

    private ListNode merge(ListNode node1, ListNode node2) {
        ListNode root = new ListNode();
        ListNode node = new ListNode();
        if (node1.val > node2.val) {
            node = node2;
            node2 = node2.next;
        } else {
            node = node1;
            node1 = node1.next;
        }
        root.next = node;
        while (node1 != null || node2 != null) {
            if (node1 == null) {
                node.next = node2;
                node2 = node2.next;
                node = node.next;
                continue;
            }
            if (node2 == null) {
                node.next = node1;
                node1 = node1.next;
                node = node.next;
                continue;
            }
            if (node1.val > node2.val) {
                node.next = node2;
                node2 = node2.next;
            } else {
                node.next = node1;
                node1 = node1.next;
            }
            node = node.next;
        }
        return root.next;
    }
}

关键点

  • 归并排序的思想
  • 怎样找到两段链表的头节点
  • 左边链表的尾节点需要指向空,防止循环链表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea快速生成Serializable序列化UID的方法

①在idea的File–>Settings–>Editor–>Inspections里搜索 Serializable class without serialVersionUID 记得点Apply和OK

opencv进阶08-K 均值聚类cv2.kmeans()介绍及示例

K均值聚类是一种常用的无监督学习算法&#xff0c;用于将一组数据点分成不同的簇&#xff08;clusters&#xff09;&#xff0c;以便数据点在同一簇内更相似&#xff0c;而不同簇之间差异较大。K均值聚类的目标是通过最小化数据点与所属簇中心之间的距离来形成簇。 当我们要预测…

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

参考文章&#xff1a; re学习笔记&#xff08;27&#xff09;攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…

【C++ 记忆站】缺省参数

文章目录 缺省参数的概念缺省参数的分类1、全缺省参数2、半缺省参数 缺省参数实际应用场景 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 正常调用一…

MySQL 安装 audit 日志审计插件

下载 我的MySQL版本是 5.7.37的&#xff0c;用的是日志审计插件&#xff08;audit-plugin&#xff09;是1.1.10的&#xff0c;大家可以对应自己版本去下载。 https://github.com/trellix-enterprise/mysql-audit/releases 配置 1、进入到/opt目录下载 audit&#xff0c;可以…

《Zookeeper》源码分析(十三)之 投票管理器

目录 QuorumVerifier数据结构构造函数containsQuorum() SyncedLearnerTracker功能 QuorumVerifier QuorumVerifier用于保存集群选举服务器信息以及选举期间判断投票是否过半&#xff0c;它的创建过程如下&#xff1a; 默认创建的是它的实现类QuorumMaj 数据结构 构造函数 从…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中&#xff0c;有多种方式操作Elasticsearch&#xff1a; 客户端工具&#xff1a;发送http请求(RESTful风格)操作…

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外&#xff0c;编程语言中还会大量使用比较运算&#xff0c;并会根据比较运算的结果是“真”还是“假”&#xff0c;来执行不同的代码。 当你想买一杯奶茶&#xff0c;准备支付的时候&#xff0c;支…

Reis过期删除策略

介绍 在Redis中&#xff0c;我们可以为键值对设置有效期&#xff0c;现在面临一个问题&#xff0c;如果一个键值对过期了&#xff0c;那么我们应该怎么删除呢&#xff1f; 我们目前有三种方案&#xff1a; 定时删除&#xff1a;在设置键的过期时间的同时&#xff0c;为此键设…

特殊链表(循环单链表,循环双链表,静态链表)

目录 1.循环单链表的初始化 2.循环双链表 3. 静态链表 (1)静态链表的初始化 (2)静态链表的插入 1.循环单链表的初始化 typedef int ElemType; typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;bool InitList(LinkList &L) {L(LNode*)malloc(…

【兔子王赠书第1期】数据结构与算法有必要区分嘛?

文章目录 数据结构与算法有必要区分嘛好书推荐《数据结构与算法&#xff08;Python语言实现&#xff09;》粉丝福利 | 评论免费送书 数据结构与算法有必要区分嘛 数据结构与算法&#xff0c;是计算机科学的基础课程&#xff0c;对于初学者来说&#xff0c;常常会有些困惑&…

企业微信电脑端开启chrome调试

首先&#xff1a; Mac端调试开启的快捷键&#xff1a;control shift command d Window端调试开启的快捷键: control shift alt d 这边以Mac为例&#xff0c;我们可以在电脑顶部看到调试的入口&#xff1a; 然后我们点击 『浏览器、webView相关』菜单&#xff0c;勾选上…

【Vue】Vue 使用 Print.js 打印选中区域的html,用到的是Element ui table表格,解决页面样式不出现或者table表格样式错乱问题!!!

步骤 1. 下载 Print.js 插件 npm install print-js --save2.main.js文件中导入 Print.js 插件 import print from print-js页面使用 需求&#xff1a;打击打印按钮&#xff0c;文字内容以及表格中的内容 vue Print.js打印页面样式不出现 解决方案 加上这句就好了&#xff…

“代码驭宠而行“:探索Python的魔法世界,开启编程奇幻之旅!

文章目录 &#x1f340;引言&#x1f340;第一步&#xff1a;安装Python和开发环境&#x1f340;第二步&#xff1a;掌握基本语法&#x1f340;第三步&#xff1a;使用Python库和模块&#x1f340;第四步&#xff1a;实践项目和练习&#x1f340;第五步&#xff1a;学习进阶主题…

vue使用jsplumb 流程图

安装jsPlumb库&#xff1a;在Vue项目中使用npm或yarn安装jsPlumb库。 npm install jsplumb 创建一个Vue组件&#xff1a;创建一个Vue组件来容纳jsPlumb的功能和呈现。 <template><div style"margin: 20px"><div style"margin: 20px">&l…

20款美规奔驰GLS450更换AMG GLS63原厂刹车卡钳,刹车效果强悍无比

对于M.Benz的车迷来说&#xff0c;AMG必定是他们的圣物&#xff0c;经过AMG改装的成品无一不是拥有动力强横&#xff0c;目操控性、舒适性都能够兼备的。下面所介绍的这套制动系统&#xff0c;便是由AMG出品的大六活塞卡钳及大直径开孔刹车碟&#xff0c;所组成的制动套件。

UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力场 在生成中添加&#xff1a; 效果&#xff1a; ​编辑 在更新中添加&#xff1a; 效果&…

CSS变形与动画(三):animation帧动画详解(用法 + 四个例子)

文章目录 animation 帧动画使用定义例子1 字母例子2 水滴例子3 会动的边框例子4 旋转木马 animation 帧动画 定义好后作用于需要变化的标签上。 使用 animation-name 设置动画名称 animation-duration: 设置动画的持续时间 animation-timing-function 设置动画渐变速度 anim…

[C++] 迭代器失效示例

迭代器失效&#xff1a; 如果迭代器失效&#xff0c;那么就不能再使用这个迭代器。 如果使用&#xff0c;那么结果是未定义的。 我们以模拟实现vector的insert为例。 一、野指针 1、insert实现 这里的pos会变成野指针。 当扩完容后&#xff0c;由于空间的改变&#xff0…