086. 分隔链表

题目链接

一、题目描述

(一) 题目

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置

(二) 示例

示例 1:

输入:head = [1,4,3,2,5,2], x = 3

输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2

输出:[1,2]

(三) 提示

  • 链表中节点的数目在范围[0, 200]
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

二、代码实现

(一) 迭代

1. 解题思路

这个题不是很难,只要理解题意加上构造两个子链即可完成,链表而不是数组,构建子链不增加空间复杂度。勇敢地构造子链,无需考虑节点交换。

图解如下:

通过图解,可以了解迭代的大致流程,但是我们在 Java 代码实现时,还需要维护两个对应的指针,用来调整它的 next 指针。

为什么需要这个指针而不是直接使用构造的节点呢?原因是我们在不断的遍历中,指针会不断的下移,当我们合并完成所有的节点时,此时的指针是在最后,这时我们在获取合并后的链表就比较麻烦了。

而用指针代替节点去进行 next 指针的移动,当返回链表时,只需返回节点的 next 即可。

为什么指针节点增加后,节点链表也会变动呢?这涉及到引用问题,这里直接引用拷贝的是堆中的内存地址,也就是说指针和对应节点就是一个对象,详情见我的另一篇文章《深拷贝和浅拷贝》。

还有一个注意事项,遍历结束后,我们将 large 的 next 指针置空,这是因为当前节点复用的是原链表的节点,而其 next 指针可能指向一个小于 x 的节点,我们需要切断这个引用,否则可能会出现环链表。

代码实现如下:

class Solution {
    public ListNode partition(ListNode head, int x) {
        //构造两个子链表
        ListNode small = new ListNode(-1);
        ListNode large = new ListNode(-1);

        //构造子链表对应的指针,方便
        ListNode smallPointer = small;
        ListNode largePointer = large;

        while(head != null){
            if(head.val < x){
                smallPointer.next = head;	//追加节点
                smallPointer = smallPointer.next;	//指针后移
            }else{
                largePointer.next = head;	//追加节点
                largePointer = largePointer.next;	//指针后移
            }
            head = head.next;	//指针后移
        }

        //当前节点复用的是原链表的节点,很可能后面还指向一个小于x的节点
        largePointer.next = null;	
        smallPointer.next = large.next;		//链表拼接
        return small.next;
    }
}

2. 复杂度分析

时间复杂度

O(n),其中 n 是链表的长度,需要遍历链表一次。

空间复杂度

O(1),定义的变量使用的常数大小空间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.6.16 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、匹配问题 5、SuperGlue架构 5.1、注意力图神经网络&#xff08;Attentional Graph Neural Network&#xff09; 5.2、最佳匹配层&#xff08;Optimal matching layer&#xff09; 5.3、损失 6、实验 6.…

数据分析第三讲:numpy的应用入门(二)

NumPy的应用&#xff08;二&#xff09; 数组对象的方法 获取描述统计信息 描述统计信息主要包括数据的集中趋势、离散程度和频数分析等&#xff0c;其中集中趋势主要看均值和中位数&#xff0c;离散程度可以看极值、方差、标准差等&#xff0c;详细的内容大家可以阅读《统计…

【Java】已解决java.sql.SQLException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLException异常 在Java中&#xff0c;java.sql.SQLException是一个通用的异常类&#xff0c;用于表示在数据库操作中发生的错误。无论是类型错误、数据类型不匹配…

YOLOv10改进 | 注意力篇 | YOLOv10引入iRMB

1. iRMB介绍 1.1 摘要:本文重点关注开发现代、高效、轻量级的模型来进行密集预测,同时权衡参数、FLOP 和性能。 反向残差块(IRB)作为轻量级 CNN 的基础设施,但基于注意力的研究尚未认识到对应的部分。 这项工作从统一的角度重新思考高效IRB和Transformer有效组件的轻量级…

国际版游戏陪练源码电竞系统源码支持Android+IOS+H5

&#x1f3ae;电竞之路的得力助手 一、引言&#xff1a;电竞新纪元&#xff0c;陪练小程序助力成长 在电竞热潮席卷全球的今天&#xff0c;每一个电竞爱好者都渴望在竞技场上脱颖而出。然而&#xff0c;独自一人的游戏之路往往充满了挑战和困难。幸运的是&#xff0c;国际版游…

Flutter框架高阶——Window应用程序设置窗体窗口背景完全透明

文章目录 1.修改 main.cpp1&#xff09;C 与 Win32 API2&#xff09;EnableTransparency()3&#xff09;中文注释 2.编写 Flutter 代码1&#xff09;bitsdojo_window2&#xff09;window_manager3&#xff09;区别对比4&#xff09;同时使用&#xff08;1&#xff09;设置初始化…

全球AI视频技术竞赛加速:Runway即将推出更优更快的第三代AI视频模型|TodayAI

Runway即将在未来几天推出其更优更快的第三代AI视频模型&#xff0c;这是新一代模型中最小的一个。据公司透露&#xff0c;这款名为Gen-3的模型将带来“在真实度、一致性和动态效果上的重大提升”&#xff0c;同时在速度上也有显著的加快。 去年六月&#xff0c;Runway首次推出…

【每日刷题】Day70

【每日刷题】Day70 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 922. 按奇偶排序数组 II - 力扣&#xff08;LeetCode&#xff09; 2. 905. 按奇偶排序数组 - 力扣&…

数据库 | 试卷三

1.数据库的网状模型应满足的条件是&#xff08; &#xff09; A&#xff0e;允许一个以上结点无双亲&#xff0c;也允许一个结点有多个双亲 B&#xff0e;必须有两个以上的结点 C&#xff0e;有且仅有一个结点无双亲&#xff0c;其余结点都只有一个双亲 D&#xff0e;每个结…

模拟原神圣遗物系统-小森设计项目,需求分析

需求分析 我操控某个角色的圣遗物时发现&#xff0c;一开始玩啥也不懂慢慢了解&#xff0c;今天才想起要不做一个 &#xff0c;然后开始想需求 跟Ai聊技术 聊着聊着 发现圣遗物 这个东西有点意思 本来今天打算写一下数据库 的外键想起了一些高兴的事情&#xff08;美人鱼&#…

数字孪生技术及其广泛应用场景探讨

通过将实际物理世界中的物体或系统建模、模拟和分析&#xff0c;数字孪生技术可以提供更精确、更可靠、更高效的解决方案。数字孪生技术在智能制造、城市建设、智慧物流等众多领域中得到了广泛的应用。 通过将数据可视化呈现在虚拟环境中&#xff0c;我们可以更清晰地观察和理…

搜索引擎数据库介绍

搜索引擎数据库的定义 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库&#xff0c;是非结构化大数据处理分析领域中重要的角色。搜索引擎数据库使用索引对数据中的相似特征进行归类&#xff0c;并提高搜索能力。通过对索引和检索过程的优化&#xff0c;以处理大量文本…

安装vue时候发现npm淘宝镜像不能使用,报出:npm.taobao.org和registry.npm.taobao.or

2024.3.12 安装vue时候发现npm淘宝镜像不能使用&#xff0c;需要重新更换源&#xff0c;简单来说就是更换镜像 使用 npm config get registry 查看当前的镜像&#xff1b; npm config get registry 使用npm config set registry http://mirrors.cloud.tencent.com/npm/ &…

【GD32F303红枫派使用手册】第二十节 SPI-SPI NAND FLASH读写实验

20.1 实验内容 通过本实验主要学习以下内容&#xff1a; SPI通信协议&#xff0c;参考19.2.1东方红开发板使用手册 GD32F303 SPI操作方式&#xff0c;参考19.2.2东方红开发板使用手册 NAND FLASH基本原理 SPI NAND介绍 使用GD32F303 SPI接口实现对GD5F1GQ5UEYIGY的读写…

VB从右向左移动的Label

Label的ForeColor设置成红色&#xff0c;BackColor设置成Transparent. Public Class Form1Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.TickLabel1.Left Label1.Left - 100If Label1.Left Label1.Width < 0 ThenLabel1.Left WidthEnd If…

Tailwindcss 提取组件

背景 随着项目的发展&#xff0c;您不可避免地会发现自己需要重复使用常用样式&#xff0c;以便在许多不同的地方重新创建相同的组件。这在小组件&#xff08;如按钮、表单元素、徽章等&#xff09;中最为明显。在我的项目中是图表标题样式如下&#xff1a; <div class&qu…

工业园安全生产新保障:广东地区加强可燃气体报警器校准检测

广东&#xff0c;作为我国经济的重要引擎&#xff0c;拥有众多工业园区。 这些工业园区中&#xff0c;涉及化工、制药、机械制造等多个领域&#xff0c;每天都会产生和使用大量的可燃气体。因此&#xff0c;可燃气体报警器的安装与校准检测&#xff0c;对于保障工业园区的安全…

从手动到智能:电子行业PLM安规管理的转型之旅

随着科技的飞速发展&#xff0c;电子产品已经成为我们生活中不可或缺的一部分。然而&#xff0c;这些产品在给人们带来便利的同时&#xff0c;也可能带来触电、火灾、有害辐射等安全隐患。为了保护消费者的生命财产安全&#xff0c;国家对电子产品实施了严格的安全标准&#xf…

【SpringCloud】负载均衡(Spring Cloud LoadBalancer)

负载均衡 当服务流量增大时&#xff0c;通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中&#xff0c;按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。 比…

华为仓颉开发语言“可能”明天正式面世(2024年6月20日写下)

众多迹象表明&#xff0c;鸽了几次的华为仓颉开发语言&#xff0c;有望在2024华为开发者大会上正式面世&#xff0c;你的期待热情是否还在&#xff1f; 1、“仓颉编程语言”公众号面世 最近&#xff0c;华为旗下的公众号“编程语言Lab”悄然改名为“仓颉编程语言”&#xff0c…