分割链表

题目: 给定一个链表的头节点和一个特定值 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,一经查实,立即删除!

相关文章

DeepSeek-R1:开源机器人智能控制系统的革命性突破

目录 引言 一、DeepSeek-R1 的概述 1.1 什么是 DeepSeek-R1&#xff1f; 1.2 DeepSeek-R1 的定位 二、DeepSeek-R1 的核心特性 2.1 实时控制能力 2.2 多传感器融合 2.3 路径规划与导航 2.4 人工智能集成 2.5 开源与模块化设计 2.6 跨平台支持 三、DeepSeek-R1 的技术…

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;即便…

Vue.js 使用组件库构建 UI

Vue.js 使用组件库构建 UI 在 Vue.js 项目中&#xff0c;构建漂亮又高效的用户界面&#xff08;UI&#xff09;是很重要的一环。组件库就是你开发 UI 的好帮手&#xff0c;它可以大大提高开发效率&#xff0c;减少重复工作&#xff0c;还能让你的项目更具一致性和专业感。今天…

队列 + 宽搜(4题)

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

计算机基础知识(第二篇)

计算机基础知识&#xff08;第二篇&#xff09; 嵌入式技术 嵌入式技术 特点&#xff1a;专用性、实时性、低成本、可靠性、体积小 应用&#xff1a;汽车电子、家用电器、通信设备、安防监控、工业自动化、医疗设备 体系结构&#xff1a; 冯诺依曼结构&#xff1a;传统计…

HTML 标题

HTML 标题 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;而标题则是网页中不可或缺的元素。标题不仅能够帮助用户快速了解网页内容&#xff0c;还能够对搜索引擎优化&#xff08;SEO&#xff09;产生重要影响。本文将详细介绍HTML标题的用法…

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

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

sentinel的限流原理

Sentinel 的限流原理基于 流量统计 和 流量控制策略&#xff0c;通过动态规则对系统资源进行保护。其核心设计包括以下几个关键点&#xff1a; 流量统计模型&#xff1a;滑动时间窗口 Sentinel 使用 滑动时间窗口算法 统计单位时间内的请求量&#xff0c;相比传统的固定时间窗…

【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一…

Nginx知识

nginx 精简的配置文件 worker_processes 1; # 可以理解为一个内核一个worker # 开多了可能性能不好events {worker_connections 1024; } # 一个 worker 可以创建的连接数 # 1024 代表默认一般不用改http {include mime.types;# 代表引入的配置文件# mime.types 在 ngi…

RabbitMQ快速上手及入门

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

DeepSeek本地部署的一些问题记录

1、模型怎么不保存到C盘&#xff1a;关掉ollama之后&#xff0c;设置环境变量&#xff1a;OLLAMA_MODELS&#xff0c;环境变量的地址&#xff0c;改为你想要的地址&#xff0c;参考文章&#xff1a; https://blog.csdn.net/u012151594/article/details/142062199 2、ollama rm…

leetcode_680 验证回文串

1. 题意 在最多去掉一个字符的情况下&#xff0c;判断一个字符串是否是回文串。 2. 题解 双指针 两个指针i j分别指向字符串开头和结尾&#xff0c;如果相同则同时向中间移动&#xff1b;如果不同则判断剩下的字符串&#xff0c;去掉头或者去掉尾能否成一回文串。 i 0j sz…

java使用pcap4j进行报文发送和接收

1、pcap4j框架使用的驱动Npcap需要进行安装 2、获取自己window电脑的mac地址设备 在cmd中使用的命令是getmac 使用程序获取服务器本身的mac地址 import org.pcap4j.core.PcapNativeException; import org.pcap4j.core.PcapNetworkInterface; import org.pcap4j.core.Pcaps;…

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

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

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

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