LeetCode2.两数相加

2023-11-05

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.


示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
 

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零



解题思路:

这题思路比较简单,但也需要注意一些细节,比如动态内存开辟的时候,指针不能指向错了,最后一个结点需要指向空指针等。

刚开始的想法是先将原有的两个数相加的结果给算出来,用int类型元素存储,然后再在堆区开辟空间,倒序存放每一位数,后来提交发现只能通过几百个用例,原因就是累加的结果超出了整型值范围,所以把int改为long long,提及后能通过更多用例,但是也不能AC,这个时候再仔细重读了一下题目,原来有可能出现100位的数,肯定不能用这种方法了。

但那就更简单了,只需要把相应位置的数相加再加上进位,得到的数如果大于等于10,就产生进位,否则不进位,进位的那位数,需要减10存储,然后更新进位标志为1,不进位的直接存储,进位标志置0即可。会出现相加的两个数位数不同的情况,此时以较小数为标准,在该数的位数结束之前,需要两数相加+进位,在此之后,只需要较大数的相应位+进位即可;所有位数加完后还需要检验进位是否为1,是1就需要再开辟一个空间存放,否则不需要,二者最后都要指向空指针。

代码如下:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int i=0,j=0,k=0,flag=0,tmp;
    char num1[100],num2[100];
    struct ListNode *p0,*p1,*p2;
    p1=l1;
    while(p1!=NULL)
    {
        num1[i++]=p1->val+'0';
        p1=p1->next;
    }
    num1[i]='\0';
    p1=l2;
    while(p1!=NULL)
    {
        num2[j++]=p1->val+'0';
        p1=p1->next;
    }
    num2[j]='\0';
    p2=p1=p0=malloc(sizeof(struct ListNode));
    while(num1[k]!='\0'&&num2[k]!='\0')
    {
        tmp=num1[k]+num2[k]-2*'0'+flag;
        if(tmp>=10)
        {
            flag=1;
            tmp-=10;
        }
        else
        {
            flag=0;
        }
        p1=p2;
        p1->val=tmp;
        p1->next=malloc(sizeof(struct ListNode));
        p2=p1->next;
        k++;
    }
    if(num1[k]=='\0'&&num2[k]!='\0')
    {
        while(num2[k]!='\0')
        {
            tmp=num2[k]-'0'+flag;
            if(tmp>=10)
            {
                flag=1;
                tmp-=10;
            }
            else
            {
                flag=0;
            }
            p1=p2;
            p1->val=tmp;
            p1->next=malloc(sizeof(struct ListNode));
            p2=p1->next;
            k++;
        }
    }
    else if(num1[k]!='\0'&&num2[k]=='\0')
    {
        while(num1[k]!='\0')
        {
            tmp=num1[k]-'0'+flag;
            if(tmp>=10)
            {
                flag=1;
                tmp-=10;
            }
            else
            {
                flag=0;
            }
            p1=p2;
            p1->val=tmp;
            p1->next=malloc(sizeof(struct ListNode));
            p2=p1->next;
            k++;
        }     
    }
    if(flag)
    {
        p1=p2;
        p1->val=1;
    }
    p1->next=NULL;
    return p0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode2.两数相加 的相关文章

  • 计算机中CPU的运行到函数的调用过程

    以下内容是摘抄博客 https www cnblogs com liunlls p cpu html CPU的内部结构 我们都知道CPU是一台电脑的核心部件 所有的程序都是通过它运行的 那么CPU是如何让一个程序跑起来的呢 我们今天就来一起
  • 测多少数据量?几个G?多少reads?如何换算?

    关键词 lncRNA表达量低 所以要看lncRNA的表达量变化 就要比普通RNA seq多测一些 要兼顾SNP和低表达量的lncRNA 要测得更深一些 到底需要测多少数据量呢 我们看看权威的ENCODE对RNA seq的测序深度是如何评价的

随机推荐

  • vue自学笔记(1)

    环境配置 vue官网 编写一个helloworld程序 我使用的是vscode 你可以使用官方网站推荐的hbuilderx 项目结构 导入vue js html中的代码 h1 hello world h1 hr div message di
  • SQLi LABS Less-19

    第19关使用POST请求提交参数 后端对用户名和密码进行了特殊字符转译 难度较大源码如下 但后面插入HTTP Referer时 并没有对参数进行过滤 我们可以从Referer入手 首先 输入正确的账号和密码 只有账号和密码都正确 才能操作R
  • MySQL8数据库原理与应用(微课版)课后笔记-实训7

    最近学习笔记记录 仅供学习参考 在完成课后实训7前所需的建表语句如下 CREATE TABLE bmdmb bmh varchar 10 NOT NULL COMMENT 部门号 bmmc char 50 NOT NULL COMMENT
  • 理解ConvNeXt网络(结合代码)

    目录 1 简介 2 ConvNeXt的设计与实验 2 1 macro design 大的结构上的设计 2 1 1 Changing stage compute ratio 改变每个stage的堆叠次数 2 1 2 Changing stem
  • 简单制作后台系统页面(含菜单)

    第一步 制作数据库表 我个人喜欢在PowerDesigner先建好数据库模型 然后导入到mysql里 导入方式 在PowerDesigner导航栏点开Datebase选择Datebase Generation再选择最后的preview 然后
  • Day.js 常用用法

    我认为克服恐惧最好的办法理应是 面对内心所恐惧的事情 勇往直前地去做 直到成功为止 罗斯福 Day js 时间戳转换 const nowTime dayjs format console log 获取当前时间 nowTime const n
  • GPT4来了!微软云能否反超亚马逊夺冠,就靠它了

    文 光锥智能 作者 刘雨琦 Azure 微软云 能否反超AWS 亚马逊云 夺冠 就靠ChatGPT了 今天凌晨 GPT4横空出世 支持图像输入和混合输入 多模态大模型的出现 将对算力产生更高的需求 一场由ChatGPT引发的算力革命 即将给
  • TCP的三次握手(一个好男人追女孩的故事)一看必懂系列

    网络世界如情场 女生指代服务端 在网络协议内 和TCP是纯情男的作风 UDP作风则称为 渣男 理由非常的简单 由于UDP的行为就是从来不会和任何女人产生感情 不建立连接 因此追女生的效率 具有高效率的特性 就比TCP作风高的多 从来不付出
  • 通过U盘向服务器拷贝文件

    目录 完整操作流程 检查U盘是否被识别 gt 挂载U盘 gt 拷贝文件 gt 卸载U盘 检查U盘是否被识别 挂载U盘 拷贝文件 卸载U盘 完整操作流程 检查U盘是否被识别 gt 挂载U盘 gt 拷贝文件 gt 卸载U盘 检查U盘是否被识别
  • 数据结构算法设计——深搜DFS(走迷宫)

    一 什么是深搜 深搜就是 深度搜索 也就是 深度优先的搜索 那什么是 深度优先 呢 我们拿最常见的迷宫问题举例 深度优先就是你照着一条路死命的走 有个形象的说法叫 不撞南墙不回头 一直到这条路走不通了 再返回上一步选择其他的方向 在算法中我
  • Java8 Streams用法总结大全 之 Collector用法详解

    1 前言 在 Java8 Streams用法总结大全 之 Stream中的常见操作 中 我们已经学习了Stream中的常用操作 其中也提到了collect 的用法 当时只是通过入参Collectors toList 实现了把Stream转为
  • [SQL]postgreSQL中如何查找无主键的sql语句

    查找postgreSQL数据库中 查找无主键的表 可以通下面语句查找 select from pg tables where hasindexes is false and schemaname public
  • 新编法学概论--吴祖谋

    新编法学概论 吴祖谋 2007 pdf 介绍法学概论的书籍 但是写的太官僚了 什么阶级论 之类的开头 让我读着那样的不理解 能不能有本写的比较通俗易懂的法学概论 这样的书籍 真心的不喜欢看 但是没办法 还是看一看吧 1 宪法 三次完全的更新
  • 什么是代码区、常量区、静态区(全局区)、堆区、栈区?

    前言 和作者有同样的感觉 对代码区 常量区 静态区 全局区 堆区 栈区没有较深刻的认识 通过查找网络找到本篇比较优秀的文章 特此转发 摘自CSDN https blog csdn net u014470361 article details
  • oracle中translate与replace的使用

    1 translate 语法 TRANSLATE char from to 用法 返回将出现在from中的每个字符替换为to中的相应字符以后的字符串 若from比to字符串长 那么在from中比to中多出的字符将会被删除 三个参数中有一个是
  • OpenCV中的图像腐蚀和膨胀操作有哪些?

    在OpenCV中 图像腐蚀 Erosion 和膨胀 Dilation 是常用的图像形态学操作 它们可以用于去除噪声 填充空洞 提取图像中的结构等 下面是几种常见的腐蚀和膨胀操作 腐蚀操作 图像腐蚀可以通过函数cv2 erode 来实现 腐蚀
  • [Linux Audio Driver] 音频POP音问题归纳总结

    1 板级电容 电感发声 情况就是你设备开机之后 啥也没干 然后听到呲啦刺啦的声音 这种情况我遇到过一次 这个是 不合理的结构设计或者走线导致的 硬件实力挖坑 需要改版解决 2 播放声音长时间有杂音 这个锅我们送给硬件 这个是芯片之间有干扰
  • SVN 启动模式

    首先 在服务端进行SVN版本库的相关配置 手动新建版本库目录 mkdir opt svn 利用svn命令创建版本库 svnadmin create opt svn runoob 使用命令svnserve启动服务 svnserve d r 目
  • java tomcat远程调试端口_tomcat开发远程调试端口以及利用eclipse进行远程调试

    一 tomcat开发远程调试端口 方法1 WIN系统 在catalina bat里 SET CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp transpor
  • LeetCode2.两数相加

    给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的 并且每个节点只能存储 一位 数字 请你将两个数相加 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外 这两个数都不会以 0 开头 示例 1