分割链表

题目: 给定一个链表的头节点和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于等于 x 的节点之前 ( 链表中节点数为[0,500],不要求链表的顺序 )

思路一:在原链表上进行修改

在原链表进行修改,若 pcur 节点的值小于 x ,往后走;若 pcur 节点的值大于或等于 x ,为插在原链表后,删除旧节点


思路二: 创建新链表

若 pcur 节点的值小于 x, 头插在新链表中;若 pcur 节点的值大于或等于 x, 尾插在新链表中


思路三: 创建新链表 小链表和大链表

对于每一个链表,只需要尾插即可,思路更为清淅

typedef struct ListNode ListNode;
ListNode* mergeTwoLists(ListNode* head, int x)
{if (head == NULL){return head;    }//创建两个带头链表ListNode* lesshead, *lesstail;ListNode* greaterhead, *greatertail;lessHead = (ListNode*)malloc(sizeof(ListNode));greaterhead = (ListNode*)malloc(sizeof(ListNode));//遍历原链表,将原链表中的节点尾插到大小链表中ListNode* pcur = head;while (pcur){if (pcur->next < x){lesstail->next = pcur;pcur = pcur->next;        }    else{greatertail->next = pcur;pcur = pcur->next;        }}lesstail->next = greaterhead->next;ListNode* ret = lessehad->next;free(Lesshead);free(geaterhead);lesshead = greaterhead = NULL;return ret;
}

 当我们运行这段代码,会发现超出时间限制,也就是发生了死循环。重新审视代码,我们发现,虽然我们处理了小链表的尾节点,但是大链表的尾节点我们一直没有处理。回到我们示例的情况,大链表的最后一个节点是 5,但是它对于原来的链表,它的 next 指向的是 2 , 所以在将两个链表相连的时候 5 又指回了 2,链表中出现一个小环,在打印链表时会陷入死循环,这就是导致问题的地方。

最后只需加一句:

lesstail->next = greaterhead->next;
//修改大链表的尾节点的next指针指向
greatertail->next = NULL;  //若不加这一句,代码会死循环ListNode* ret = lessehad->next;

还没完

再次运行代码,依然超时

假设原链表只有一个节点 1 , x = 2,此时我们看回代码,1 这个节点会进入小链表,但是,由于我们创建的两个哨兵位是没有设置初始值的,所以 greaterhead->next 其实是指向随机的地址,我们无法得知是哪个地址所以程序报错。

只需将这两段代码调换位置,即先对哨兵位设置初始值即可解决问题。

我们直接看修改后的完整代码(标注了调换的位置)

typedef struct ListNode ListNode;
ListNode* mergeTwoLists(ListNode* head, int x)
{if (head == NULL){return head;    }//创建两个带头链表ListNode* lesshead, *lesstail;ListNode* greaterhead, *greatertail;lessHead = (ListNode*)malloc(sizeof(ListNode));greaterhead = (ListNode*)malloc(sizeof(ListNode));//遍历原链表,将原链表中的节点尾插到大小链表中ListNode* pcur = head;while (pcur){if (pcur->next < x){lesstail->next = pcur;pcur = pcur->next;        }    else{greatertail->next = pcur;pcur = pcur->next;        }}//调换位置后//修改大链表的尾节点的next指针指向greatertail->next = NULL;  //若不加这一句,代码会死循环lesstail->next = greaterhead->next;ListNode* ret = lessehad->next;free(Lesshead);free(geaterhead);lesshead = greaterhead = NULL;return ret;
}

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

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

相关文章

starrocks最佳实践、行业实践

最佳实践 starrocks最佳实践 最佳实践集合 Bitmap索引适用场景和最佳实践 行业实践 行业实践

响应式编程_01基本概念:前世今生

文章目录 引言响应式编程的技术优势全栈式响应式编程从传统开发模式到异步执行技术Web 请求与 I/O 模型异步调用的实现技术回调Future机制 响应式编程实现方法观察者模式发布-订阅模式数据流与响应式 响应式宣言和响应式系统 引言 大流量、高并发的访问请求的项目&#xff0c;…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…

队列 + 宽搜(4题)

目录 1.n叉树的层序遍历 2.二叉树的锯齿形层序遍历 3.二叉树的最大宽度 4.在每个树行中找最大值 1.n叉树的层序遍历 429. N 叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 我们只需要把某个节点出队的时候把它的孩子节点添加进来即可。 出队的次数就是最开始队列…

惰性函数【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》

【Ⅱ】《事件绑定的自我修养&#xff1a;从青铜到王者的进化之路》 1. 代码功能大白话&#xff08;给室友讲明白版&#xff09; // 青铜写法&#xff1a;每次都要问浏览器"你行不行&#xff1f;" function addEvent青铜版(element, type, handler) {if (window.add…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎

2.28 NumPyMatplotlib&#xff1a;科学可视化的核心引擎 目录 #mermaid-svg-KTB8Uqiv5DLVJx7r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KTB8Uqiv5DLVJx7r .error-icon{fill:#552222;}#mermaid-svg-KTB8Uqiv5…

upload-labs安装与配置

前言 作者进行upload-labs靶场练习时&#xff0c;在环境上出了很多问题&#xff0c;吃了很多苦头&#xff0c;甚至改了很多配置也没有成功。 upload-labs很多操作都是旧时代的产物了&#xff0c;配置普遍都比较老&#xff0c;比如PHP版本用5.2.17&#xff08;还有中间件等&am…

【OS】AUTOSAR架构下的Interrupt详解(下篇)

目录 3.代码分析 3.1中断配置代码 3.2 OS如何找到中断处理函数 3.3 Os_InitialEnableInterruptSources实现 3.4 Os_EnableInterruptSource 3.5 DisableAllInterrupts 3.5.1Os_IntSuspendCat1 3.5.2 Os_InterruptDisableAllEnter 3.5.3 Disable二类中断 3.5.4 Disable一…

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…

糖化之前,为什么要进行麦芽粉碎?

糖化的目的是将麦芽中的淀粉转化为可发酵性的糖分&#xff0c;而糖化之前&#xff0c;进行麦芽粉碎是确保糖化效果的关键步骤。本文天泰将阐述麦芽粉碎的重要性及其对酿造过程的影响。 一、麦芽粉碎的目的 增加酶的作用面积&#xff1a;麦芽中的淀粉和蛋白质等物质需要通过酶…

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…

利用腾讯云cloud studio云端免费部署deepseek-R1

1. cloud studio 1.1 cloud studio介绍 Cloud Studio&#xff08;云端 IDE&#xff09;是基于浏览器的集成式开发环境&#xff0c;为开发者提供了一个稳定的云端工作站。支持CPU与GPU的访问。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器即可使用。Clo…

《黑马点评》实战笔记

目录 P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 P3 短信登录 基于session实现短信登录的流程 P4 短信登录 实现发送短信验证码功能 P5 短信登录 实现短信验证码登录和注册功能 P6 短信登录 实现登录校验拦截器 P7 短信登录 隐藏用户敏感信息 P8 短信登录 …

python的pre-commit库的使用

在软件开发过程中&#xff0c;保持代码的一致性和高质量是非常重要的。pre-commit 是一个强大的工具&#xff0c;它可以帮助我们在提交代码到版本控制系统&#xff08;如 Git&#xff09;之前自动运行一系列的代码检查和格式化操作。通过这种方式&#xff0c;我们可以确保每次提…

第一性原理:游戏开发成本的思考

利润 营收-成本 营收定价x销量x分成比例 销量 曝光量x 点击率x &#xff08;购买率- 退款率&#xff09; 分成比例 100%- 平台抽成- 税- 引擎费- 发行抽成 成本开发成本运营成本 开发成本 人工外包办公地点租金水电设备折旧 人工成本设计成本开发成本迭代修改成本后续内容…

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…

详解分布式锁

目录 基于MYSQL实现 通过 insert 实现 通过 select 实现 基于Redis实现 基于set实现 redlock 基于zookeeper实现 在分布式系统中对于共享资源我们需要确保在任何时刻只有一个节点或进程能够访问&#xff0c;也就需要加锁&#xff0c;而我们的本地锁无法满足这个需求&…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

物业管理系统源码提升社区智能化管理效率与用户体验

内容概要 物业管理系统源码是一种针对社区管理需求而设计的软件解决方案&#xff0c;通过先进的智能化技术&#xff0c;使物业管理变得更加高效和人性化。随着城市化进程的加快&#xff0c;社区的管理复杂性不断增加&#xff0c;而这一系统的推出恰好为物业公司提供了极大的便…

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…