当前位置: 首页 > ops >正文

LeetCode - 面试题 02.04. 分割链表

题目

面试题 02.04. 分割链表 - 力扣(LeetCode)

双指针合并思路

这个双指针的思路是将原链表分成两个子链表,然后再合并它们:

创建两个子链表:

  • 一个子链表用于存放所有小于x的节点(smalldummy开头)
  • 一个子链表用于存放所有大于等于x的节点(largedummy开头)

使用双指针维护两个子链表:

  • smallptr始终指向小值链表的尾部
  • largeptr始终指向大值链表的尾部
  • 这两个指针使我们能够在O(1)时间内向各自的链表添加新节点

遍历原链表:

  • 对于每个节点,根据其值与x的比较结果,将其添加到对应的子链表中
  • 重要的是,我们不是创建新节点,而是直接移动原链表中的节点

合并两个子链表:

  • 将大值链表的末尾节点的next指针设为nullptr(防止循环引用)
  • 将小值链表的末尾连接到大值链表的开头

这种方法的优势在于:

  • 时间复杂度为O(n),只需遍历链表一次
  • 空间复杂度为O(1),只使用了常数额外空间(两个dummy节点)

读者可能的错误写法

class Solution {
public:ListNode* partition(ListNode* head, int x) {if(head == nullptr){return nullptr;}ListNode* smalldummy = new ListNode(0);ListNode* largedummy = new ListNode(0);ListNode* smallptr = smalldummy;ListNode* largeptr = largedummy;while(head){if(head->val < x){smallptr->next = head;smallptr = smallptr->next;}else{largeptr->next = head;largeptr = largeptr->next;}head = head->next;}smallptr->next = largedummy->next;return smalldummy->next;}
};

没有将大值链表的末尾节点的next指针设置为nullptr。

当你遍历完原链表后,大值链表的最后一个节点(largeptr)的next指针仍然指向原链表中的下一个节点,这可能会导致循环引用。

正确写法

class Solution {
public:ListNode* partition(ListNode* head, int x) {if(head == nullptr){return nullptr;}ListNode* smalldummy = new ListNode(0);ListNode* largedummy = new ListNode(0);ListNode* smallptr = smalldummy;ListNode* largeptr = largedummy;while(head){if(head->val < x){smallptr->next = head;smallptr = smallptr->next;}else{largeptr->next = head;largeptr = largeptr->next;}head = head->next;}largeptr->next = nullptr;  // 这行很重要,防止循环引用smallptr->next = largedummy->next;return smalldummy->next;}
};
http://www.xdnf.cn/news/10180.html

相关文章:

  • gcc相关内容
  • 单例模式的类和静态方法的类的区别和使用场景
  • python打卡day41
  • bert扩充或者缩小词表
  • 企业AI部署热潮下的安全隐忧:速度与安全的博弈
  • QT入门学习
  • 电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!
  • 【基础算法】高精度(加、减、乘、除)
  • 【iOS】方法交换
  • 【SpringBoot实战】优雅关闭服务
  • 【NLP 78、手搓Transformer模型结构及实战】
  • 34.x64汇编写法(一)
  • stm32——I2C协议
  • 第三方软件评测机构如何助力软件品质提升及企业发展?
  • 微信小程序真机调试时如何实现与本地开发环境服务器交互
  • 27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践
  • 设计模式——面向对象设计六大原则
  • JavaScript 在 AcroForm 中的广泛应用
  • 设计模式——抽象工厂设计模式(创建型)
  • 【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程
  • linux进程用户态内存泄露问题从进程角度跟踪举例
  • LG P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III Solution
  • spring boot项目中的一些常用提示信息
  • 工业物联网中的事件驱动采样架构及优化
  • MySQL项目实战演练:搭建用户管理系统的完整数据库结构【MySQL系列】
  • 机器视觉2D定位引导一般步骤
  • 视频监控联网系统GB28181协议中事件通知流程详解以及通知失败常见原因
  • 目前主流图像分类模型的详细对比分析
  • 前端-不对用户显示
  • 小明的Java面试奇遇之互联网保险系统架构与性能优化