leetcode86:分隔链表

给你一个链表的头节点 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:分析题目

这道题的本质是对链表进行重新排序。目标是将链表中小于给定值 x 的所有节点移到链表的前半部分,而大于等于 x 的节点在后半部分,并保持每个分区内节点的相对顺序不变。

输入条件

  • 链表的头节点 head,链表中的节点数目范围为 [0, 200],节点值的范围为 [-100, 100]
  • 一个整数值 x,用于分隔链表,范围为 [-200, 200]

输出条件

  • 重新排序后的链表。

边界条件

  1. 链表为空时,直接返回 null
  2. 链表的所有节点值都小于 x,不需要进行排序。
  3. 链表的所有节点值都大于或等于 x,同样不需要排序。

步骤2:解题思路及步骤

由于链表需要分隔成两部分,可以通过创建两个新的链表来分别存储小于 x 的节点和大于等于 x 的节点。这样可以避免在链表中进行插入操作,从而保持链表的稳定性,并减少链表遍历的复杂度。

  1. 创建两个虚拟头节点 :分别用于小于 x 和大于等于 x 的节点链表。
  2. 遍历链表 :根据节点值将节点加入到对应的链表中:
    • 如果节点的值小于 x,则将节点加入到"小于 x"链表的尾部。
    • 如果节点的值大于或等于 x,则将节点加入到"大于等于 x"链表的尾部。
  3. 合并链表 :遍历完毕后,将"小于 x"链表的尾部与"大于等于 x"链表的头部连接起来,形成最终的链表。
  4. 返回结果 :返回"小于 x"链表的头节点。

算法设计思路

  • 由于链表需要分隔并合并,遍历链表的时间复杂度为 O(n),其中 n 是链表的节点数。
  • 空间复杂度为 O(1),因为只需要常数级别的额外空间。

步骤3:C++代码实现

代码解释

  1. 使用 lessHeadgreaterHead 虚拟节点来开始分别存储小于 x 和大于等于 x 的节点。
  2. 遍历链表,根据值将节点放入对应的链表尾部。
  3. 合并链表,less->next = greaterHead->next 连接两个链表,并确保 greater->nextnullptr 来终止链表。
  4. 最终返回 lessHead->next 作为新的链表头。

步骤4:启发与优化

  1. 双链表方法:通过使用两个链表来处理分隔问题,而不是直接在一个链表上做复杂的插入操作,简化了逻辑并保持了链表的稳定性。
  2. 空间效率 :通过虚拟节点和链表分隔,不需要开辟额外的节点空间,保持了 O(1) 的空间复杂度。
  3. 实际应用:在处理需要按某一条件排序或分隔链表的数据时,比如订单处理系统中按金额大小分隔订单流,该方法十分高效。

步骤5:实际应用场景

在金融行业中,该算法可用于实时交易处理系统,将交易按金额或优先级进行分类处理。例如,银行系统可以实时分隔小于一定额度的转账交易,以便优先处理较大金额交易。

实现方法

  • 交易流作为链表,每个节点代表一笔交易。
  • 根据交易金额动态调整链表中的顺序,将大额交易置于前,以提高其处理优先级。
  • 类似本算法的双链表方法,可以将交易链表一分为二,并在连接后按照需求传输至处理单元,实现了高效的交易分类处理。
相关推荐
珠海西格电力30 分钟前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
山登绝顶我为峰 3(^v^)32 小时前
C/C++ 交叉编译方法
java·c语言·c++
还有多久拿退休金2 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby4 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀4 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince5 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>5 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
researcher-Jiang5 小时前
算法训练:堆 & 可并堆
算法
郝学胜-神的一滴5 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
在书中成长5 小时前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos