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

每日一题(两数相加)

每日一题(两数相加)

2. 两数相加 - 力扣(LeetCode)

在这里插入图片描述

思路

思路:

  1. 由于链表从头开始向后存储的是低权值位的数据,所以只需要两个指针p1和p2,分别从链表的头节点开始遍历。同时创建一个新的指针newhead,(用于构造新链表,将创建的新节点进行头插)。并在这个构造的新链表的相应的节点中存储p1和p2对应值的相加结果。

  2. 但是p1和p2所对应的节点的值相加可能会产生进位,所以创建一个pre变量用于存储相应的进位值。(假设p1和p2所指向的节点的值是n1和n2,那么产生的进位值就是:pre = (n1+n2+pre)/10;同时对应新的创建的节点的值就应该是 (pre+n1+n2)%10;。对应代码如下:

        struct ListNode* p1=NULL,   *p2 = NULL, *newhead = NULL,*tail = NULL;int pre = 0;//pre一开始的值必须是0if(!l1)return l2;if(!l2)return l1;p1 = l1;p2 = l2;while(p1&&p2){
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = (p1->val+p2->val+pre)%10;newnode->next = NULL;if(newhead == NULL){//更新pre(进位)pre = (p1->val + p2->val)/10;newhead = tail = newnode;}else{//更新pre(进位)pre = (p1->val + p2->val+pre)/10;tail->next = newnode;tail = tail->next;}p1 = p1->next;p2 = p2->next;}
    
  3. 假如遇到的链表有以下这种长短不一的情况:就需要接着遍历那个较长的链表,将较长的链表中未被遍历的节点的值与pre的值一起参与运算,(因为这俩个链表的相同长度的部分的链表的最后一个节点中存储的值也会存在相加产生进位的情况)。代码实现如下:

    while(p2)//当p2没有走完{
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = (p2->val+pre)%10;newnode->next = NULL;//更新prepre = (p2->val+pre)/10;p2 = p2->next;tail->next = newnode;tail = tail->next;} while(p1)//当p1没有走完{
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = (p1->val+pre)%10;newnode->next = NULL;//更新prepre = (p1->val+pre)/10;p1 = p1->next;tail->next = newnode;tail = tail->next;}
    

    在这里插入图片描述

  4. 假如链表是如下这几种情况,即便是将两个链表都遍历之后,此时的进位值仍然是1,说明此时的相加计算还没有结束,此时还需要一个节点来存储进位值,所以在将两个链表遍历结束之后,需要对pre的值进行判断,假若pre的值是0,则直接返回newhead即可,pre的值若是1,则还需要创建一个节点。代码如下:

    if(pre){
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = pre;newnode->next = NULL;tail->next = newnode;tail = tail->next;}
    

    在这里插入图片描述在这里插入图片描述

代码实现

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){struct ListNode* p1=NULL,   *p2 = NULL, *newhead = NULL,*tail = NULL;int pre = 0;if(!l1)return l2;if(!l2)return l1;p1 = l1;p2 = l2;while(p1&&p2){
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = (p1->val+p2->val+pre)%10;newnode->next = NULL;if(newhead == NULL){//更新pre(进位)pre = (p1->val + p2->val)/10;newhead = tail = newnode;}else{//更新pre(进位)pre = (p1->val + p2->val+pre)/10;tail->next = newnode;tail = tail->next;}p1 = p1->next;p2 = p2->next;}if(pre){
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = pre;newnode->next = NULL;tail->next = newnode;tail = tail->next;}return newhead;
}

完结

两数相加的链表习题的分析就到这里啦,若有不足,欢迎评论区指正,下期见!

http://www.lryc.cn/news/167938.html

相关文章:

  • 恒运资本:沪指震荡涨0.28%,医药板块强势拉升,金融等板块上扬
  • 【计算机网络】Tcp详解
  • 最简单的laravel不使用任何扩展导出csv
  • Android studio 断点调试、日志断点
  • 服务器数据恢复-热备盘同步过程中硬盘离线的RAID5数据恢复案例
  • Python 使用input获取用户输入
  • Python 可迭代对象、迭代器、生成器
  • HTML的有序列表、无序列表、自定义列表
  • 银河麒麟安装Docker-国产化-九五小庞
  • 数据库与身份认证
  • LabVIEW开发锅炉汽包水位的监督控制和模拟
  • 2023-简单点-树莓派安装ncnn框架
  • Docker核心原理与实操
  • 虚幻引擎 UE5 增强输入系统
  • Mac 安装软件各种报错解决方案
  • leetcode做题笔记142. 环形链表 II
  • DuDuTalk:4G语音工牌,如何实现家庭上门维修服务过程的智能化管理?
  • Mybatis常见面试题总结
  • 数字IC设计之时序分析基础概念汇总
  • 1.centos7安装docker
  • 基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo
  • 第26节-PhotoShop基础课程-形状工具组-画板
  • 第一次课,通过进程信息和服务信息识别当前计算机运行程序(预习版)
  • ChatGPT 或其它 AI,能用在文书创作上吗?
  • Java中锁的分类
  • centos安装flink,通过windows访问webui
  • 如何让两台手机相互远程控制?
  • 预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解
  • 【7z密码】7z压缩包密码忘记了,怎么办?i
  • 部署云MYSQL(在线版)