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

每日算法-链表(2.两数相加、24.两两交换链表中的节点、143.重排链表)

一.两数相加

1.1题目描述

1.2题解思路

定义两个指针l1,l2依次遍历两个链表,用变量add存储l1加l2的值,将add的个位数取出来充当新节点的值,然后将add的个位数删去,即add /=10,循环此操作。

重点分析:

1.跟归并排序中合并两个有序数组类似,当两个链表并不是一样长,其中一个链表并没有遍历完!!!

2.当两个链表都遍历完之后,如果add的值为1,则需要再增加一个节点,它的值为1.

1.3.题解代码

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int add = 0;ListNode* newhead = new ListNode(-1);//创建虚拟头结点ListNode* cur = newhead;while(l1 && l2){add += l1->val + l2->val;ListNode* tmp = new ListNode(add%10);//将个位存进去add /= 10;cur->next = tmp;l1 = l1->next;l2 = l2->next; cur = cur->next;}while(l1){add += l1->val;ListNode* tmp = new ListNode(add%10);add /= 10;cur->next = tmp;l1 = l1->next;cur = cur->next;}while(l2){add += l2->val;ListNode* tmp = new ListNode(add%10);add /= 10;cur->next = tmp;l2 = l2->next; cur = cur->next;}//判断边界情况if(add == 1){ListNode* tmp = new ListNode(1);cur->next = tmp;cur = cur->next;}return newhead->next;}
};

二.两两交换链表中的节点

2.1题目描述

2.2题解思路

首先添加虚拟头结点,遍历这个链表,定义四个指针,prev,cur,next,nnext,模拟实现两个相邻链表翻转,然后更新prev,cur,next,nnext,循环此操作

重点分析:

1.当给的链表为空或者只有一个数据时,直接返回。

2.循环结束条件,当是偶数个数字时,cur!=nullptr,当是奇数个数字时,next != nullptr。

2.3题解代码

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(!head || !head->next) return head;ListNode* newhead = new ListNode(-1);//虚拟头节点newhead->next = head;ListNode* prev = newhead,*cur = prev->next,*next = cur->next,*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;}return newhead->next;}
};

三.重排链表

3.1题目描述

3.2题解思路

1.找到链表的中间节点(快慢双指针)

2.将第二个链表逆序(头插法)

注意区分开curnext与cur->next,tmpnext与tmp->next

3.合并两个链表

注意需要把第一个链表的最后一个节点的next置空

3.3题解代码

class Solution {
public:void reorderList(ListNode* head) {if(!head->next || !head->next->next) return;        ListNode* newhead = new ListNode(-1);//添加虚拟头结点            //找到链表的中间节点(快慢双指针)    ListNode* q1 = head,*q2 = head;while( q2->next && q2->next->next){q1 = q1->next;q2 = q2->next->next;}//反转q1后面的节点(头插法)ListNode* tmp = new ListNode(-2);ListNode* cur = q1->next,*curnext = cur->next,*tmpnext = tmp->next;while(cur){cout<<cur->val;//头插tmp->next = cur;cur->next = tmpnext;//更新指针cur = curnext;if(cur) curnext = cur->next;tmpnext = tmp->next;}//合并两个链表q1->next = nullptr;//注意!!!ListNode* cur1 = head,*cur2 = tmp->next;cur = newhead;while(cur1 || cur2){if(cur1){cur->next = cur1;cur1 = cur1->next;cur = cur->next;cur->next = nullptr;}if(cur2){cur->next = cur2;cur2 = cur2->next;cur = cur->next;cur->next = nullptr;}}}
};

相关文章:

  • 怎么通过OPPO手机进行图片编辑?图片编辑攻略,打造专业级照片
  • vscode格式化为什么失效?自动保存和格式化(Prettier - Code formatter,vue-format)
  • MySQL入门:数据表的创建
  • HTTP HTTPS RSA
  • AI核心概念之“结构化输出(Structured Output)” - 来自DeepSeek
  • Terraform - 理解 Count 和 For_Each 循环
  • 力扣 283 移动零的两种高效解法详解
  • 深度学习--神经网络的构造
  • AI核心概念之“提示(Prompt)” - 来自DeepSeek
  • Python字符串操作全解析:从基础到高阶应用
  • mysql关联查询语句
  • C/C++条件判断
  • 混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
  • flutter doctor 信号号超时
  • CCF CSP 第36次(2024.12)(1_移动_C++)
  • 基于STM32、HAL库的TCA9555PWR I/O扩展器驱动程序设计
  • linux如何用关键字搜索日志
  • 学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)
  • 【微信小程序】报错: http://127.0.0.1:7001 不在以下 request 合法域名列表中
  • 危化品安全员考试常见与注意事项
  • 出国留学、来华留学呈现双增新趋势,“00后留学生个性鲜明”
  • 韩国京畿道骊州市市长率团访问菏泽:想和菏泽一起办牡丹节
  • 儒说︱问世间孝为何物
  • 南方医科大学原副校长宁习洲主动投案,接受审查调查
  • 人民论坛:是民生小事,也是融合大势
  • 经济日报:美离间国际关系注定徒劳无功