【算法笔记】LeetCode_86 分隔链表

LeetCode_86 分隔链表

LeetCode_86 分隔链表

题目描述

给你一个链表的头节点 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

思路

这道题算是中等难度里面比较简单的了,但有个小坑困扰了我半个小时,特此记录一下:

题目整体思路很简单,解答的时候可以想象在给苹果分类,比如给你一批苹果,大小不一,然后你面前有两个桶,左边的桶写着(直径大于15cm),右边的桶写着(其他),然后你依次测量苹果直径然后放进两个桶内,至于题目说的“保持原始的次序”,由于链表的特性,这个不是问题。

所以我们初始化两个局部对象ListNode * leftPart, rightPart,然后对原始链表进行遍历,如果当前节点的val小于x就连接到leftPart,否则连接到rightPart,最后,连接leftPart的末尾和rightPart的开头,非常简单。

我说的小坑是:一定不要忘记将新链表的最后一个node指向nullptr,否则整个链表可能产生环,运行不过

代码解析

class Solution {  
public:  ListNode* partition(ListNode* head, int x) {  // 如果链表为空或只有一个节点,则无需分区,直接返回原链表  if (head == nullptr || head->next == nullptr)  {  return head;  }  // 初始化左、右两个链表的虚拟头节点  ListNode * leftPart = new ListNode();  ListNode * leftHead = leftPart;  ListNode * rightPart = new ListNode();  ListNode * rightHead = rightPart;  // 遍历原链表  while(head != nullptr)  {  // 如果当前节点的值小于x,将其加入左链表  if (head->val < x)  {  leftPart->next = head;  leftPart = leftPart->next;  }  // 如果当前节点的值大于等于x,将其加入右链表  else  {  rightPart->next = head;  rightPart = rightPart->next;  }  // 移动到原链表的下一个节点  head = head->next;  }  // 将右链表的末尾置为nullptr,防止成环  rightPart->next = nullptr;  // 将左链表的末尾指向右链表的头节点,形成新的链表  leftPart->next = rightHead->next;  // 返回新链表的头节点(左链表的第二个节点)  return leftHead->next;  }  
};

思想

这段代码使用了双指针的思想,通过遍历原链表,将节点按照值的大小分别连接到两个新的链表(左链表和右链表)中。最后,将右链表的头节点之前的节点(即虚拟头节点)断开,并将左链表的末尾指向右链表的头节点,从而完成链表的分区。

方法

  • 创建两个虚拟头节点leftPartrightPart来初始化左链表和右链表。
  • 遍历原链表,根据节点的值将节点分别加入到左链表或右链表中。
  • 遍历结束后,将右链表的末尾置为nullptr,防止成环。
  • 将左链表的末尾指向右链表的头节点,形成新的链表。
  • 返回新链表的头节点。

时间复杂度

时间复杂度为O(n),其中n是链表的长度。因为只需要遍历一次链表。

空间复杂度

空间复杂度为O(1)。虽然创建了四个新的ListNode对象,但它们是固定数量的,不随链表长度的变化而变化。因此,空间复杂度是常数级别的。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

采用苹果应用商店上架工具的经验与案例研究

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

Yarn简介及Windows安装与使用指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

一阶低通滤波器特性对比

分析y[n]qx[n](1-q)y[n-1] 和 1/&#xff08;Ts1&#xff09; 两款常用滤波器的区别 代码下载链接&#xff1a; https://download.csdn.net/download/RNG_uzi_/89048367

LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking)

通过分解将对称正定厄米特矩阵分解成下三角矩阵L和对角矩阵D来求其逆矩阵 目录 前言 一、LDL^H基本算法 二、LDL^H Right-Looking算法 三、D矩阵求逆 四、L矩阵求逆 五、A矩阵求逆 六、计算量分析 七、MATLAB仿真 八、参考资料 总结 前言 在线性代数中&#xff0c;LDL…

数据可视化-ECharts Html项目实战(7)

在之前的文章中&#xff0c;我们学习了如何设置漏斗图、仪表盘。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 数据可视化-ECharts Html项目实战&#xff08;6…

利用 Scapy 库编写 ARP 缓存中毒攻击脚本

一、ARP 协议基础 参考下篇文章学习 二、ARP 缓存中毒原理 ARP&#xff08;Address Resolution Protocol&#xff09;缓存中毒是一种网络攻击&#xff0c;它利用了ARP协议中的漏洞&#xff0c;通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC…

JAVA的NIO和BIO底层原理分析

文章目录 一、操作系统底层IO原理1. 简介2. 操作系统进行IO的流程 二、BIO底层原理1. 什么是Socket2. JDK原生编程的BIO 三、Java原生编程的NIO1. 简介2. NIO和BIO的主要区别3. Reactor模式4. NIO的三大核心组件5. NIO核心源码分析 一、操作系统底层IO原理 1. 简介 IO&#x…

产品经理的自我修养

点击下载《产品经理的自我修养》 1. 前言 在产品领域取得成功的关键在于持续的激情。只有保持热情不减,我们才能克服各种困难,打造出卓越的产品。 如果你真心渴望追求产品之路,我强烈建议你立即行动起来,亲自参与实际的产品创作。无论是建立一个网站、创建一个社群,还是…

黑苹果安装,黑苹果小白详细教程

前言&#xff08;废话&#xff09;本人电脑小白&#xff0c;看了网上很多的教程&#xff0c;整合用了20个小时&#xff0c;反正看的太多了&#xff0c;反而不知道咋弄了&#xff0c;最后看不下去了&#xff0c;就试了一下&#xff0c;结果稀里糊涂的成功了&#xff0c;我也不知…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集&#xff1a; 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

【Redis教程0x08】详解Redis过期删除策略内存淘汰策略

引言 Redis的过期删除策略和内存淘汰策略是经常被问道的问题&#xff0c;这两个机制都是做删除操作&#xff0c;但是触发的条件和使用的策略是不同的。今天就来深入理解一下这两个策略。 过期删除策略 Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将…

Aigtek:功率放大器的定义、指标参数及性能特点

功率放大器是一种电子器件或电路&#xff0c;用于将输入信号的功率放大到更高的功率级别。它在各种应用中起到关键的作用&#xff0c;例如音频放大器、射频放大器、激光放大器等。下面西安安泰将介绍功率放大器的定义、指标参数以及其性能特点。 功率放大器的定义&#xff1a; …