算法-分隔链表

news2024/11/15 10:13:28

一、题目描述

(一) 题目

给你一个链表的头节点 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),定义的变量使用的常数大小空间。

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

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

相关文章

用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念 支持向量机回归&#xff08;Support Vector Regression, SVR&#xff09;是支持向量机&#xff08;SVM&#xff09;的一个应用&#xff0c;主要用于回归任务。与分类任务中的 SVM 类似&#xff0c;SVR 通过找到一个最大化边界&#xff08;即支持向…

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位&#xff0c;长空格是1&#xff0c;短空格是0&#xff0c;全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目&#xff0c;里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法&#xff0c;方法里面包含lodash的cloneDeep&#xff0c;cloneDeep在这个页面并没有引入&#xff0c;但是vscode却没有提示&#xff0c;很不友好&#xff0c;容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的&#xff0c;在一般逻辑中队列是一个用 来存储数据的中间容器&#xff08;前边几个阻塞队列也是用来存放数据的&#xff09;&#xff0c;但SynchronousQueue 却不是用来存放数据的&#xff0c;…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中&#xff0c;非线性系统的稳定性和自激振荡&#xff08;self-oscillation&#xff09;问题往往较线性系统更为复杂。为了分析这些问题&#xff0c;描述函数法&#xff08;Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的&#xff0c;需要把资源通过qrc放到exe里面&#xff0c;然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图&#xff0c;我这边选择高德地图&#xff0c;层级选择0-15级别即可&#xff0c;进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下&#xff0c;打开前盖&#xff0c;然后按住开始键不松手&#xff0c;直到所有指示灯全部亮起后再松开手&#xff0c;然后将硒鼓取出再装回&#xff0c;盖上前盖&#xff0c;清零操作完成。 联想LJ2405打印机碳粉清零…

编程学习之路:如何克服挫折感,成为更好的自己

目录 编程学习之路&#xff1a;如何克服挫折感&#xff0c;成为更好的自己 一、小瓜有话说 1、学习的广度可以带动深度 2、清空大脑和清空代码都是解决问题的方式 ①清空大脑&#xff1a;睡个觉&#xff0c;拉个屎&#xff0c;吃顿饭。 ②清空代码&#xff1a;换一种思维…

花钱买不到系列-深刻理解进程地址空间

花钱买不到系列—linux虚拟地址空间-CSDN博客https://blog.csdn.net/weixin_49529507/article/details/141272458?spm1001.2014.3001.5501 在上一篇文章中&#xff0c;引出了虚拟地址这块&#xff0c;也用大富翁给儿子们画饼的例子解释&#xff0c;通过大富翁的例子&…

内存管理篇-03物理内存管理-32位

正片从现在开始了。 1.结构体关联 当DDR初始化后&#xff0c;整个内存就可以访问了。但是需要合理的管理&#xff0c;防止内存碎片以及安全相关的问题。因此需要对物理内存进行严格的管理。 物理内存分为&#xff1a;页&#xff0c; 分区&#xff0c;内存节点。DMA需要连续的内…

配置PXE预启动执行环境:Kickstart自动化无人值守安装

文章目录 实现 Kickstart 无人值守安装1. 安装Kickstart和配置应答文件&#xff08;图形化界面&#xff09;2. 配置 PXE 菜单支持 Kickstart 无人值守安装3. 验证 Kickstart 无人值守安装4. 拓展&#xff1a;命令行配置应答文件&#xff08;命令行界面&#xff09; 实现 Kickst…

猜数3次-python

题目要求&#xff1a; 定一个数字&#xff08;1-10&#xff0c;随机产生&#xff0c;通过3次判断来猜出数字&#xff09; 数字随机产生&#xff0c;范围1-10有三次机会猜测数字&#xff0c;通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps&#xff1a;补充随机函数 imp…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…

合合信息文档解析Coze插件发布,PDF转Markdown功能便捷集成

近日&#xff0c;TextIn开发的PDF转Markdown插件正式上架Coze平台。 在扣子搜索“pdf转markdown”&#xff0c;或在Coze平台搜索“pdf2markdown”&#xff0c;即可找到插件&#xff0c;在你的专属智能体中便捷使用文档解析功能。 如果想测试解析插件在你需要的场景下表现如何&…

R语言VAR模型的多行业关联与溢出效应可视化分析

全文链接&#xff1a;https://tecdat.cn/?p37397 摘要&#xff1a;本文对医疗卫生、通信、金融、房地产和零售等行业的数据展开深入研究。通过读取数据、计算收益率、构建 VAR 模型并进行估计&#xff0c;帮助客户进一步分析各行业变量的影响及残差的协方差与相关矩阵&#xf…

xml打印模板解析-SAAS本地化及未来之窗行业应用跨平台架构

一、为何要自己设置打印模板系统 1.确保自由知识产权 2.支持跨平台&#xff1a;物联网&#xff0c;自助终端&#xff0c;电脑&#xff0c;web&#xff0c;C#&#xff0c;jsp,android,java,php 等多种语言 二、xml 代码解析 package CyberWinPHP.Cyber_Plus;import java.io.…

2024下半年软考有哪些科目开考?该怎么选?

近年来&#xff0c;软考&#xff08;软件水平考试&#xff09;的难度逐渐攀升&#xff0c;这并非源于题目本身的复杂化&#xff0c;而是官方对通过率的调控策略所致。整体通过率维持在13%左右&#xff0c;高级别考试更是低至10%以下&#xff0c;考生需慎重对待。以湖南2024年上…

数据仓库建模的步骤-从需求分析到模型优化的全面指南

想象一下,你正站在一座巨大的图书馆前。这座图书馆里存放着你公司所有的数据。但是,书籍杂乱无章,没有分类,没有索引。你如何才能快速找到所需的信息?这就是数据仓库建模要解决的问题。本文将带你深入了解数据仓库建模的主要步骤,让你掌握如何将杂乱的数据转化为有序、高效、易…

Java | Leetcode Java题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPerfectSquare(int num) {double x0 num;while (true) {double x1 (x0 num / x0) / 2;if (x0 - x1 < 1e-6) {break;}x0 x1;}int x (int) x0;return x * x num;} }