【刷题13】链表专题

目录

  • 一、两数相加
  • 二、两两交换链表的节点
  • 三、重排链表
  • 四、合并k个升序链表
  • 五、k个一组翻转链表

一、两数相加

题目:
在这里插入图片描述

思路:

  • 注意整数是逆序存储的,结果要按照题目的要求用链表连接起来
  • 遍历l1的cur1,遍历l2的cur2,和一个整数t,用来表示进位(t等于1,要进位;t等于0,不需要进位)
  • 先固定好头节点newhead,所以cur1和cur2指向的val先要运算。为什么要先固定好头节点,因为方便后面尾插
  • 相加的结果为变量tmp,如果>=10,就取后面的数(%10),并且t=1;否则直接用相加后的tmp来构造节点的值,t还是0
  • 进入循环条件,只要cur1、cur2、t任意一个不为空(t不等于0),就能进入循环,有节点,就加节点的值,没节点就用进位
  • 循环中,每次的tmp要刷新为0,cur1不为空,tmp+=cur1->val,cur1往后走;cur2不为空,tmp+=cur2->val,cur2往后走;t等于1,说明有进位,tmp+=1。如果tmp>=10,tmp取后面的数,t = 1;否则还是相加后的tmp,t = 0;
  • 然后构造新节点,val为tmp,尾插
  • 循环后,tail->next 记得置为空(最好),返回newhead

代码:

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* cur1 = l1;ListNode* cur2 = l2;int t = 0;// 进位int tmp = cur1->val + cur2->val;cur1 = cur1->next;cur2 = cur2->next;if(tmp >= 10){t = 1;tmp %= 10;}ListNode* newhead = new ListNode(tmp);ListNode* tail = newhead;while(cur1 || cur2 || t){tmp = 0;if(cur1 != nullptr) {tmp += cur1->val;cur1 = cur1->next;}if(cur2 != nullptr) {tmp += cur2->val;cur2 = cur2->next;}if(t) tmp += t;if(tmp >= 10){t = 1;tmp %= 10;} else t = 0;ListNode* newnode = new ListNode(tmp);tail->next = newnode;tail = tail->next;}tail->next = nullptr;return newhead;}
};

二、两两交换链表的节点

题目:
在这里插入图片描述
解法一: 交换值(能过)
思路:

  • 链表为空,返回空
  • 链表只有一个节点,返回该链表
  • 链表大于1个节点:prev指向第一个节点,cur指向第二个节点,循环为cur不为空
  • 进入循环,cur和prev的节点值交换,然后prev指向cur的下一个节点,如果prev不为空,cur指向prev的下一个节点(相当于走了两步);否则直接跳出循环
  • 然后原来的链表

代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* cur = head->next;ListNode* prev = head;while(cur){int t = cur->val;cur->val = prev->val;prev->val = t;prev = cur->next;if(prev == nullptr) break;cur = prev->next;}return head;}
};

解法二: 交换节点
思路:

  • 如果为空链表或者链表只有一个节点,直接返回head
  • 定义一个哨兵位头节点,方便后续连接操作
  • 定义4个指针:
    在这里插入图片描述
  • 注意连接顺序和可能为空的情况
  • 让head重新指向修改后的tmp的next,销毁tmp,返回head

代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* tmp = new ListNode(0);tmp->next = head;ListNode* prev = tmp;ListNode* cur = head;ListNode* next = cur->next;ListNode* nnext = next->next;while(cur && next){prev->next = next;next->next = cur;cur->next = nnext;//prev = cur;cur = nnext;// 可能为空if(cur) next = cur->next;if(next) nnext = next->next;}head = tmp->next;//delete tmp;return head;}
};

三、重排链表

题目:
在这里插入图片描述
思路:
在这里插入图片描述

  • 找到中间节点,中间节点之后逆序,然后如图先h1插入节点,再h2插入节点
  • 如果链表的节点只有一个,还是原来的链表
  • 找到中间节点——快慢双指针法
  • 链表逆序——头插法
  • 定义newhead为head,先固定第一个节点。h1为中间节点后逆序的链表,h2为head的下一个节点
  • h1不为空,尾插h1的节点;h2不为slow(因为slow指向的是中间节点的位置)尾插h2的节点
  • 循环结束,tail->next等于空,head=newhead,即还原head

代码:

class Solution {
public:void reorderList(ListNode* head) {if(head->next == nullptr) head = head;else {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;} ListNode* mid = slow;ListNode* h1 = nullptr;while(mid){ListNode* next = mid->next;mid->next = h1;h1 = mid;mid = next;}ListNode* h2 = head->next;ListNode* newhead = head;ListNode* tail = newhead;while(h1){tail->next = h1;tail = tail->next;h1 = h1->next;if(h2 != slow){tail->next = h2;tail = tail->next;h2 = h2->next;}}tail->next = nullptr;head = newhead;}}
};

四、合并k个升序链表

题目:
在这里插入图片描述
思路:
小堆,所有的链表的节点放入小堆,然后取顶部依次尾插(注意:要考虑链表的某个节点可能为空的情况)

代码:

class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<int, vector<int>, greater<int>> pq;// 小堆ListNode* newhead =nullptr;ListNode* tail= nullptr;// k * n=500(节点数)for(auto &l : lists){if(l){ListNode* cur = l;while(cur){pq.push(cur->val);cur = cur->next;}}}// log(n*k) => log(k)while(!pq.empty()){int t = pq.top();ListNode* newnode = new ListNode(t);if(tail == nullptr){tail = newhead = newnode;}else {tail->next = newnode;tail = tail->next;}pq.pop();}return newhead;}
};

五、k个一组翻转链表

题目:
在这里插入图片描述

思路:

  • 两层循环,外面是翻转的组的个数,里面的一组的节点数(头插法)
  • 先用哨兵位节点newhead固定,然后接下来每组的节点翻转后尾插到新的节点后面(刚开始是哨兵位节点,后面是上一组第一个头插的节点)
  • 最后返回newhead的下一个节点,记得循环哨兵位节点

代码:

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* newhead = new ListNode(0);// 哨兵位节点先固定,方便后面连接ListNode* tail = newhead;// 方便找尾int n = 0;// 节点数ListNode* cur = head;// 遍历链表while(cur){n++;cur = cur->next;}n /= k;// 翻转的组的个数int y = k;// 为了还原原来的k值// cur = head;// 回到第一个节点while(n--)// 循环组数{ListNode* tmphead = nullptr;// 临时的头指针// 头插法while(k--)// 循环要翻转(头插)的节点数{ListNode* next = cur->next;cur->next = tmphead;tmphead = cur;cur = next;}k = y;// 还原ktail->next = tmphead;// 连接翻转的后一组子链表// 找到尾节点,方便下次尾插新的一组子链表while(tail->next){tail = tail->next;}}tail->next = cur;// 尾插剩余的节点while(tail->next){tail = tail->next;}tail->next = nullptr;// ListNode* ret = newhead->next;// 要返回的链表delete newhead;//return ret;}
};

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

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

相关文章

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

Linux 下执行定时任务之 Systemd Timers

不知道 ECS 因为什么缘故&#xff0c;上面安装的 MySQL 服务老是不定期挂掉&#xff0c;本来想通过 Linux 得 Cron 配置个半小时的定时检测任务&#xff0c;结果一直没有执行&#xff0c;因此又尝试使用了 Systemd Timers 进行了重新配置&#xff0c;简要做个记录。 Systemd Ti…

yocto中如何来安装systemd服务

在 Yocto 项目中安装 systemd 服务可以按照以下步骤进行&#xff1a; 1. 创建服务单元文件&#xff08;.service 文件&#xff09; 在 Recipe 中处理&#xff1a;在 Yocto 中&#xff0c;为了将服务单元文件安装到目标系统&#xff0c;首先需要在软件包的 Recipe&#xff08;…

UE5相机系统初探(一)

UE5相机系统初探&#xff08;一&#xff09; 和Unity类似&#xff0c;UE的相机也是由名为Camera的component控制的。那么&#xff0c;在UE中要如何实现一个跟随玩家的第三人称相机呢&#xff1f;假设我们已经有了一个表示玩家的类ACF_Character&#xff0c;首先第一步就是要先在…

【python】OpenCV—Tracking(10.4)—Centroid

文章目录 1、任务描述2、人脸检测模型3、完整代码4、结果展示5、涉及到的库函数6、参考 1、任务描述 基于质心实现多目标&#xff08;以人脸为例&#xff09;跟踪 人脸检测采用深度学习的方法 核心步骤&#xff1a; 步骤#1&#xff1a;接受边界框坐标并计算质心 步骤#2&…

【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除

目录 事件起因环境和工具操作过程解决办法1、找到对应的目录下的文件&#xff0c;手动去删除&#xff0c;比如我的依赖库的路径是D:\qc_code\apache-maven-3.8.2\repository 我只需要找到这个目录下对应的依赖包进行手动删除即可&#xff08;不推荐&#xff0c;强行删除文件夹文…

PostgreSQL 到 PostgreSQL 数据迁移同步

简述 PostgreSQL 是一个历史悠久且广泛使用的数据库&#xff0c;不仅具备标准的关系型数据库能力&#xff0c;还具有相当不错的复杂 SQL 执行能力。用户常常会将 PostgreSQL 应用于在线事务型业务&#xff0c;以及部分数据分析工作&#xff0c;所以 PostgreSQL 到 PostgreSQL …

Java项目实战II基于Java+Spring Boot+MySQL的智能推荐的卫生健康系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…

免费插件集-illustrator插件-Ai插件-闭合开放路径

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现图形编辑中闭合开放路径。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/8789…

Java基于SpringBoot+Vue框架的房屋租赁管理系统(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

【前端】CSS知识梳理

基础&#xff1a;标签选择器、类选择器、id选择器和通配符选择器 font:font-style(normal) font-weight(400) font-size(16px) /line-height(0) font-family(宋体&#xff09; 复合&#xff1a; 后代选择器&#xff08; &#xff09;、子选择器&#xff08;>)、并集选择器(…

第16课 核心函数(方法)

掌握常用的内置函数及其用法。 数学类函数&#xff1a;abs、divmod、max、min、pow、round、sum。 类型转换函数&#xff1a;bool、int、float、str、ord、chr、bin、hex、tuple、list、dict、set、enumerate、range、object。 序列操作函数&#xff1a;all、any、filter、m…

基于AI深度学习的中医针灸实训室腹针穴位智能辅助定位系统开发

在中医针灸的传统治疗中&#xff0c;穴位取穴的精确度对于治疗效果至关重要。然而&#xff0c;传统的定位方法&#xff0c;如体表标志法、骨度折量法和指寸法&#xff0c;由于观察角度、个体差异&#xff08;如人体姿态和皮肤纹理&#xff09;以及环境因素的干扰&#xff0c;往…

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

《高频电子线路》—— 相位平衡条件判断准则

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 相位平衡条件判断准则 反馈电压或者从电感上获得&#xff0c;或者从电容上获得。分别为电感反馈三端振荡器&#xff0c;或者是电容反馈…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日&#xff0c;是一年中的第256天&#xff0c;也是程序员节&#xff0c;同时也是怿星的生日。2014年到2024年&#xff0c;年华似水匆匆一瞥&#xff0c;多少岁月轻描淡写&#xff0c;怿星人欢聚一堂&#xff0c;共同为怿星科技的十周年庆生&#xff01; 01.回忆往昔&…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

mysql上课总结(5)(MySQL的完整性约束(详细介绍))

目录 一、完整性约束。 &#xff08;1&#xff09;概念与目的。 <1>概念。 <2>目的。 &#xff08;2&#xff09;各个约束的详细&#xff08;表格&#xff09; &#xff08;3&#xff09;各个约束的简要总结。 <1>主键约束。 <2>唯一约束。 <3>非…

msys2更换国内源(多个文件(不是3个文件的版本!))

msys2更换国内源 起因排查答案如下mirrorlist.mingw64mirrorlist.ucrt64mirrorlist.mingw32mirrorlist.mingwmirrorlist.clang64mirrorlist.clang32mirrorlist.msys 不想看经过的直接跳到答案 起因 查了很多个教程大部分都是【打开MSYS2软件内的\etc\pacman.d\ 中3个文件&…

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…