首页 > 其他分享 >力扣--两数相加

力扣--两数相加

时间:2023-09-10 20:22:40浏览次数:41  
标签:ListNode struct -- next 力扣 tail l2 l1 两数

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
题目数据保证列表表示的数字不含前导零

我的代码

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int temp, count = 0;
    struct ListNode* p1 = l1, *p2 =l2,*prev = NULL;
    while(p1 && p2){
        temp = p1->val + p2->val + count;
        if (temp >=10) {count = 1; temp = temp -10;}
        else count = 0;
        p1->val = temp;
        prev = p1; // 保存前一个节点
        p1 = p1->next;
        p2 = p2->next;
    }

    if (!p1){
        prev->next = p2;
    }
 
    while(prev->next){
        prev = prev->next;
        temp = prev->val + count;
        if (temp >=10) {count = 1; temp = temp -10;}
        else count = 0;
        prev->val = temp;
    }

    if (count) {
        struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
        prev->next = node;
        node->next = NULL;
        node->val = 1;
    }

    return l1;
}

题解:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *head = NULL, *tail = NULL;
    int carry = 0;
    while (l1 || l2) {
        int n1 = l1 ? l1->val : 0;
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + carry;
        if (!head) {
            head = tail = malloc(sizeof(struct ListNode));
            tail->val = sum % 10;
            tail->next = NULL;
        } else {
            tail->next = malloc(sizeof(struct ListNode));
            tail->next->val = sum % 10;
            tail = tail->next;
            tail->next = NULL;
        }
        carry = sum / 10;
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    if (carry > 0) {
        tail->next = malloc(sizeof(struct ListNode));
        tail->next->val = carry;
        tail->next->next = NULL;
    }
    return head;
}

总结:

大致思路

1.选取一个变量记录进位

2.我这里直接利用了之前便有的链表l1,在他的基础上改值,第一次循环到一个链表结尾。然后进行一个判断,如果l1结束,将l2的剩余部分接上去,然后再改值;如果l1没有结束,就在l1的基础上继续改值,操作同前。(这里我出现了一个小错误,如果l1结束,这里p1指向的不是最后一个节点,而是NULL,就不能直接用p1来接上p2剩余部分,要设计一个prev存取链表l1的最后一个节点)

3.这一题最容易错的是没有考虑到最后一个节点还能进位的情况,这样就会多出一个节点,需要单独进行判断。

4.题解这里设置比较巧妙,他的循环结束是直到两个链表都到结尾处,使用一个三元运算符来判断加值,并且单独设立了一个链表来存储结果,并分别设置头指针和尾指针,将数据不断往上加,但也要注意到最后一个节点进位的情况。

标签:ListNode,struct,--,next,力扣,tail,l2,l1,两数
From: https://www.cnblogs.com/trmbh12/p/17691821.html

相关文章

  • Paper Reading: Hashing-Based Undersampling Ensemble for Imbalanced Pattern Class
    目录研究动机文章贡献本文方法整体流程基于哈希的子空间划分方法基于距离的样本选择实验结果数据集和实验设置不同子空间划分方法的影响不同加权方案的抽样与其他方法比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到......
  •       ......
  • Codeforces Round 807 (Div. 2) B. Mark the Dust Sweeper
    需要打扫\(n\)个房间,第\(i\)个房间有\(a_i\)的积灰。只能使用如下魔法打扫:选择\(i,j,(1\leqi<j\leqn,\min_{k=i}^{j}a_i>0)\)。执行\(a_i=a_i-1,a_j=a_j+1\)。需要将\(1\simn-1\)号房间的积灰全部清空,最少使用多少次魔法。观察一:显......
  • 基于Docker安装RockerMQ
    1、拉取RockerMQ镜像dockerpullapache/rocketmq2、创建namesrv服务mkdir-p/usr/local/rocketmq/data/namesrv/logs/usr/local/rocketmq/data/namesrv/store3、构建namesrv容器 dockerrun-d\--restart=always\--namermqnamesrv\--privileged=true\-p98......
  • python学习笔记-redis缓存数据库
    一、缓存数据库介绍NoSQL(notonlysql)redis是业界主流的Key-valuenosql数据库之一,和memcached类似redis优点:速度快,每秒可执行大约110000设置操作,81000个/每秒的读取操作支持丰富的数据类型,列表,结合,可排序集合,哈希等操作是原子的二、redis操作安装redisubuntu安装$......
  • 【7.0】基于RabbitMQ实现RPC
    【一】RPC介绍【1】介绍RPC(RemoteProcedureCall)是一种远程过程调用的协议,它允许一个计算机程序通过网络请求调用远程服务器上的一个子程序或函数。基于RabbitMQ实现的RPC可以更加可靠地实现远程过程调用。【2】分布式的系统中使用微服务之间的调用resful的接口rpc调......
  • 多级缓存-Redis缓存预热
            ......
  • 异常
    异常入门 e.getMessage()//获取异常信息异常事件分为Error和Exception两大类。Exception又分为运行时异常和编译时异常。异常体系图文件操作时的异常就是必须处理的编译异常五大运行时异常NullPointerException空指针异常ArithmeticException运算异常ArrayIndexOutO......
  • MYSQL基础上
    MYSQL基础确保MySQL已经安装完成启动windows下进入cmd的管理运行模式启动netstartmysql80停止netstopmysql80连接客户端连接注意这里使用的命令行既然在所有目录下都可行,那么必然要改环境变量数据模型SQLDDLDDL-数据库操作查询查询所有数据库SHOWDATAB......
  • 【RabbitMQ总结】
    【RabbitMQ总结】【一】消息队列引入什么是消息队列消息队列解决的问题常见的消息队列比较【二】RabbitMQ安装什么是RabbitMQ服务器原生安装RabbitMQ客户端安装RabbitMQWindows安装RabbitMQRabbitMQ设置用户名和密码RabbitMQ界面说明【三】Ra......