C++算法(9)链表
1.两数相加2. 两数相加 - 力扣LeetCode这题要搞清楚循环的条件是当进位存在或进位不存在此时是因为还没有开始相加但cur1或cur2还都没有走到终点那么可以写成while(cur1||cur2||t)(t是进位)另外为了方便插入数据需要创建一个头节点还需创建一个指针一直指向新创建的需要返回的链表的尾节点便于插入新的节点两数相加的进位最多是1所以每次循环把t的个位作为新节点的值t/10得到进位代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode*cur1l1,*cur2l2; ListNode* newheadnew ListNode(0); ListNode* prevnewhead; int t0; while(cur1||cur2||t) { if(cur1) { tcur1-val; cur1cur1-next; } if(cur2) { tcur2-val; cur2cur2-next; } prev-nextnew ListNode(t%10); prevprev-next; t/10; } prevnewhead-next; delete newhead; return prev; } };2.两两交换链表中的节点24. 两两交换链表中的节点 - 力扣LeetCode这道题一个比较重要的点是弄明白添加头节点以中间两个元素为交换元素的四个节点为一组做交换因为这样要交换的两个节点两边都有节点是已知的交换的过程中不会断开链表另外还要明确循环结束的条件这个要通过画图来推出当节点个数为偶数时不包括新添加的头结点观察可知临界时只有prev和cur是一定有对应所指位置的所以循环重置顺序时应该先重置prev和cur看此时是否满足循环的条件再重置next和nnext由于prev在前cur在后所以循环条件要先保证prev再保证cur即写成(prev-next!NULLcur-next!NULL)代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* newheadnew ListNode(0); newhead-nexthead; ListNode* prevnewhead,*curprev-next; while(prev-next!NULLcur-next!NULL) { ListNode* nextcur-next,*nnextnext-next; prev-nextnext; next-nextcur; cur-nextnnext; prevcur; curnnext; } prevnewhead-next; delete newhead; return prev; } };3.重排链表143. 重排链表 - 力扣LeetCode这道题是多个基础题的结合分成3步①找到链表的中心节点用快慢双指针法②把后面的部分逆序三指针/头插③合并两个链表双指针注意把链表分成前后段后要注意切断前后段逆序的逻辑是把一个节点和其要头插到的两个相连的节点重新关联的过程要搞清楚重新 关联的逻辑另外还有可优化的地方如果是按照上述思路那么为了确定slow的上一个节点需要增设一个变量始终指向slow之前另外由于断开和开始逆序的位置不同对于奇数和偶数的情况要分开写代码但事实上不用对奇偶分开讨论确定逆序开始和断开的位置从slow-next或slow开始逆序得到的结果都是一样的但推荐用slow-next开始逆序因为这样可以直接从slow断开从slow-next开始逆序但如果要从slow开始逆序为了断开前一个要么设一个始终指向前面的变量要么在找中心节点之前在题给链表前连接一个头节点newhead让slow从头节点newhead开始走fast从head开始走这样slow对应的实际上是slow的前一个slow-next对应的是slow从slow断开从slow-next逆序即可最后合并两个链表可以选择创建一个新节点将前后两段的节点依次连接到新节点处也可以设置两个指向cur1和cur2后的指针来记忆cur-next代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: void reorderList(ListNode* head) { if(head-nextNULL||head-next-nextNULL) return; ListNode* fasthead,*slowhead; while(fast!NULLfast-next!NULL) { fast(fast-next)-next; slowslow-next; } ListNode* prevslow-next; slow-nextNULL; ListNode* newheadnew ListNode(0); while(prev!NULL) { ListNode* nextprev-next; prev-nextnewhead-next; newhead-nextprev; prevnext; } ListNode* cur2newhead-next,*cur1head; while(cur2!NULL) { ListNode* tmp1cur1-next; ListNode* tmp2cur2-next; cur1-nextcur2; cur2-nexttmp1; cur1tmp1; cur2tmp2; } delete newhead; } };4.合并K个升序链表23. 合并 K 个升序链表 - 力扣LeetCode方法一堆取每个链表的头节点入堆创建一个新头节点newhead把堆顶元素取出连接到newhead之后再把堆顶删除此时如果堆顶代表的节点之后还有元素将下一个元素入堆否则一直出堆顶代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: struct cmp { bool operator()(const ListNode* l1,const ListNode* l2) { return l1-vall2-val; } }; ListNode* mergeKLists(vectorListNode* lists) { priority_queueListNode*,vectorListNode*,cmp heap; for(auto l:lists) if(l) heap.push(l); ListNode* newheadnew ListNode(0); ListNode* tmpnewhead; while(!heap.empty()) { ListNode* theap.top(); tmp-nextt; heap.pop(); tmptmp-next; if(t-next) heap.push(t-next); } ListNode* retnewhead-next; delete newhead; return ret; } };方法二分治即用以前分治的方法去写区别不太大实际上是最小的单元从元素变成了链表排好序的代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* mergeTowList(ListNode*cur1,ListNode* cur2) { if(cur1nullptr) return cur2; if(cur2nullptr) return cur1; ListNode* newheadnew ListNode(0); ListNode* tmpnewhead; while(cur1cur2) { if(cur1-valcur2-val) { tmp-nextcur1; tmptmp-next; cur1cur1-next; } else { tmp-nextcur2; tmptmp-next; cur2cur2-next; } } if(cur1) { tmp-nextcur1; } if(cur2) { tmp-nextcur2; } tmpnewhead-next; delete newhead; return tmp; } ListNode* merge(vectorListNode* lists,int left,int right) { if(leftright) return lists[left]; if(leftright) return nullptr; int midleft(right-left)/2; ListNode* cur1merge(lists,left,mid); ListNode* cur2merge(lists,mid1,right); return mergeTowList(cur1,cur2); } ListNode* mergeKLists(vectorListNode* lists) { int nlists.size(); return merge(lists,0,n-1); } };暴力解法的时间复杂度是方法一的时间复杂度是方法二的时间复杂度也是5.K个一组翻转链表25. K 个一组翻转链表 - 力扣LeetCode这题的思路其实不难只要弄清要翻转多少组对每组进行K次翻转用头插的方法最后把多余的节点连接起来即可cur遍历链表tmp指向cur下一个prev指向头插的前节点由于每进行一组时需要上一组的头节点作为头插前节点所以在进行一组前先保存好cur出大循环后cur有可能指向NULL刚好是整数组K也有可能指向非NULL还有一些多余的节点此时prev已准备好prev-nextcur返回retnewhead-next代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* numshead; int n0; while(nums) { n; numsnums-next; } ListNode* newheadnew ListNode(0); ListNode* prevnewhead,*curhead; while(nk) { ListNode* acur; int ik; while(i) { ListNode* tmpcur-next; cur-nextprev-next; prev-nextcur; curtmp; i--; } n-k; preva; } prev-nextcur; ListNode* retnewhead-next; delete newhead; return ret; } };

相关新闻

MySQL 迁移中的兼容性与数据同步实践观察

MySQL 迁移中的兼容性与数据同步实践观察

MySQL 迁移中的兼容性与数据同步实践观察 在当前信创加速落地的背景下,金仓数据库(KingbaseES)因其对 MySQL 语法、协议及事务行为的深度适配能力,正被金融、医疗、政务等多个关键行业纳入核心系统技术评估范围。它不以“替代”为…

2026/7/5 18:05:24 阅读更多 →
Factory Io智能工厂联合西门子1200 PLC仿真,控制单台机械手和两台工位机械手上下料

Factory Io智能工厂联合西门子1200 PLC仿真,控制单台机械手和两台工位机械手上下料

Factory Io智能工厂联合西门子1200 PLC仿真,控制单台机械手和两台工位机械手上下料,出售为博途软件安装包+1200联合factory IO仿真程序+ Factory IO安装包直接打开建立通信可以直接仿真,有简单逻辑单台控制&#xff0c…

2026/7/6 12:23:11 阅读更多 →
小白程序员必备:5分钟收藏学会搭建你的第一个AI Agent智能体!

小白程序员必备:5分钟收藏学会搭建你的第一个AI Agent智能体!

本文介绍了AI Agent(智能体)的概念,并详细指导读者如何使用扣子(Coze)平台搭建一个“每日热点助手”智能体。文章从理论到实操,包括创建智能体、编写提示词、设置工作流等步骤,并分享了提升智能体效果的技法和心法。旨…

2026/5/17 11:07:08 阅读更多 →

最新新闻

WSL 1 vs WSL 2 性能对比:文件 I/O、网络与启动速度的 3 项实测

WSL 1 vs WSL 2 性能对比:文件 I/O、网络与启动速度的 3 项实测

WSL 1 vs WSL 2 深度性能评测:架构差异如何影响开发效率 在Windows平台上进行Linux开发的环境选择,往往决定了开发者的工作效率和体验流畅度。作为微软推出的两大子系统版本,WSL 1和WSL 2采用了截然不同的架构设计,这直接影响了文…

2026/7/7 23:54:46 阅读更多 →
CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因

CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因

CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因当你在CentOS 8或RHEL系发行版上执行yum或dnf命令时,遇到"Failed to download metadata for repo"这类错误信息,往往意味着系统无法获取软件仓库的元数据。这个…

2026/7/7 23:52:46 阅读更多 →
Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置

Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置

Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置RabbitMQ 作为企业级消息队列中间件,在分布式系统解耦、异步通信和流量削峰等场景中扮演着关键角色。本文将详细介绍在 Ubuntu 22.04 生产环境中通过官方 APT 源部署 RabbitMQ 4.3 的完整流…

2026/7/7 23:52:46 阅读更多 →
Go语言SCP服务安全实践:防御SSH会话固定攻击与安全会话管理

Go语言SCP服务安全实践:防御SSH会话固定攻击与安全会话管理

1. 项目概述与核心挑战最近在重构一个用Go语言写的内部文件传输服务,这个服务大量使用了SCP协议进行服务器间的文件同步。在安全审计的时候,我们重点关注了会话管理部分,特别是如何防御会话固定攻击。这玩意儿在Web开发里是老生常谈了&#x…

2026/7/7 23:52:46 阅读更多 →
计算机毕设 MySQL 8.0 数据库设计避坑:3个常见范式错误与性能优化方案

计算机毕设 MySQL 8.0 数据库设计避坑:3个常见范式错误与性能优化方案

MySQL 8.0数据库设计避坑指南:3个常见范式错误与性能优化实战 在计算机专业毕业设计中,数据库设计往往是决定系统质量的关键环节。许多同学虽然掌握了SQL基础语法,但在实际设计时仍会陷入各种陷阱——要么过度规范化导致查询性能低下&#xf…

2026/7/7 23:48:45 阅读更多 →
Chrome 缓存路径修改 3 种方案对比:mklink、启动参数与注册表,性能影响实测

Chrome 缓存路径修改 3 种方案对比:mklink、启动参数与注册表,性能影响实测

Chrome缓存路径修改三大方案深度评测:从符号链接到注册表调优1. 为什么需要修改Chrome缓存路径?对于长期使用Chrome浏览器的中高级用户来说,系统盘空间告急是个常见痛点。Chrome默认将所有缓存文件存储在C:\Users\[用户名]\AppData\Local\Goo…

2026/7/7 23:48:44 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻