LeetCode:2.两数相加

目录

题目:​编辑2. 两数相加 - 力扣(LeetCode)

分析问题:

官方的优秀代码+博主的注释:

博主的辣眼代码,无注释,拉出来拷打自己:

每日表情包:


 

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

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

分析问题:

本题目前来看,只能老老实实的做,仅有这一种做法:

1,首先排除,把每一个结点的val抠出来,再添回去的做法,这样复杂度会多很多,而且,链表的结点不可能太少,来个1000,你根本没法表示,

2,那么一来,很容易想到,分结点加,加好后放入新开辟的链表结点里,易想到有两种情况,加出超过10,和每超出10,而关于两个链表的长度不一致的做法,博主是分情况的,使代码复杂了,

而官方题解的解法很巧妙的避开了这个问题。

官方的优秀代码+博主的注释:

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;//当l1为NULL的时候视作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) {//最后检验会不会多出一个结点,例子:200+900 == 1100,三位进四位
        tail->next = malloc(sizeof(struct ListNode));
        tail->next->val = carry;
        tail->next->next = NULL;
    }
    return head;
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/add-two-numbers/solutions/435246/liang-shu-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

博主的辣眼代码,无注释,拉出来拷打自己:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* BuyNode()
{
    struct ListNode* ps = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(ps != NULL){
        ps->next = NULL;
        return ps;
    }
    else{
        return NULL;
    }
}
void CopyOther(struct ListNode* ps, struct ListNode* pcur)
{
    while(ps != NULL){
        pcur->next = BuyNode();
        pcur = pcur->next;;
        pcur->val = ps->val;
        ps = ps->next;
    }
    return;
}

void Case3(struct ListNode* ps,struct ListNode* pcur)
{
    while(ps != NULL){
        if(ps->val + 1 >= 10){
            pcur->next = BuyNode();
            pcur = pcur->next;
            pcur->val = ps->val + 1 - 10;
            ps = ps->next;
        }
        else{
            pcur->next = BuyNode();
            pcur = pcur->next;
            pcur->val = ps->val + 1;
            ps = ps->next;
            CopyOther(ps, pcur);
            return;
        }
    }
    pcur->next = BuyNode();
    pcur = pcur->next;
    pcur->val = 1;
    return;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* p1 = l1,*p2 = l2;
    struct ListNode* pReturn = BuyNode(), *pcur = pReturn;//pReturn 哨兵结点
    int tmp = 0;//进一
    while(p1 && p2){
        if(tmp + p1->val + p2->val >= 10){
            pcur->next = BuyNode();
            pcur->next->val = (tmp + p1->val + p2->val) - 10;
            pcur = pcur->next;
            tmp = 1;
            p1 = p1->next;
            p2 = p2->next;

        }
        else{
            pcur->next = BuyNode();
            pcur->next->val = tmp + p1->val + p2->val;
            pcur = pcur->next;
            tmp = 0;
            p1 = p1->next;
            p2 = p2->next;
        }
    }
    if(tmp){
        if(p1 == NULL){
            Case3(p2, pcur);
            return pReturn->next;
        }
        else{
            Case3(p1, pcur);
            return pReturn->next;
        
        }
    }
    if(p1 == NULL){
        CopyOther(p2, pcur);
        return pReturn->next;
        
    }
    else{
        CopyOther(p1, pcur);
        return pReturn->next;

    }
}

每日表情包:

"开窗!",这是我王小桃的地盘,不给点赞和收藏别想走 !

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习-随机梯度下降

在训练过程中使用随机梯度下降,但没有解释它为什么起作用。为了澄清这一点,将继续更详细地说明随机梯度下降(stochastic gradient descent)。 %matplotlib inline import math from mxnet import np, npx from d2l import mxnet …

C# CAD界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…

RK3568平台 设备模型基本框架-kobject 和kset

一.什么是设备模型 字符设备驱动通常适用于相对简单的设备,对于一些更复杂的功能,比如说电源管理和热插拔事件管理,使用字符设备框架可能不够灵活和高效。为了应对更复杂的设备和功能,Linux内核提供了设备模型。设备模型允许开发…

西瓜书学习笔记——流形学习(公式推导+举例应用)

文章目录 等度量映射(仅保留点与其邻近点的距离)算法介绍实验分析 局部线性嵌入(不仅保留点与其邻近点的距离还要保留邻近关系)算法介绍实验分析 等度量映射(仅保留点与其邻近点的距离) 算法介绍 等度量映…

Unity动画循环偏移的使用

最近项目中有一个需求是做煤矿中猴车的动画,动画本身不复杂,但是猴车很多,怎么能简化工作量呢? 首先单个猴车的动画循环是必须要做的,重点是怎么让不同的猴车动画按顺序错开,研究了以下,可以通过…

后端登录校验

文章目录 登录校验CookieSessionJWT生成JWT校验JWT基于JWT进行身份验证CSRF Cookie、Session、Token的区别?过滤器(Filter)配置过滤器过滤器链 登录校验 由于HTTP协议是无状态的,我们在进行登录后等一系列接口请求是无法直接区分是哪一个用户的发给服务…

电路设计(10)——超温报警电路的proteus仿真

1.题目背景 在现实生活中,常有一种工程技术,即带有自动温度补偿的设备,能在规定温度内正常工作。但是为了设备安全,需设定工作的上限温度,万一温控补偿失效,设备温度一旦超出上限温度时,便立即切…

ES高可用架构涉及常用功能整理

ES高可用架构涉及常用功能整理 1. es的高可用系统架构和相关组件2. es的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 数据分片按ip打散2.2.2 数据分片机架感知2.2.3 强制要求数据分片机架感知2.2.4 写入线程池优化2.2.5 分片balance优化2.2.6 限流控制器优化 3. es常用命令3.1 …

项目中将sass更换成less(TypeError: this.getOptions is not a function已解决)

在更换之前,首先了解sass与less在用法上的区别有哪些(这里简单提几个): 变量区别:Less中用,Sass用$sass支持条件语句,可以使用if{}else{}、for循环等,而less不支持在定义变量时候&a…

PyTorch 2.2 中文官方教程(十八)

开始使用完全分片数据并行(FSDP) 原文:pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Hamid Shojanazeri,Yanli Zhao,Shen Li 注意…

如何获取和查找您的Android设备的序列号

Hello大家好!我是咕噜铁蛋!,我们经常会在文章中提及到各种各样的Android设备,而其中一个重要的标识就是设备的序列号。设备的序列号在很多情况下被用于唯一标识一个设备,例如在软件开发中进行设备的调试和测试&#xf…

Python统计分析——参数估计

参考资料:用python动手学统计学 所谓参数就是总体分布的参数。 1、导入库 # 导入用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入用于绘图的库 from matplotlib import pyplot as plt import seabor…

FL Studio Producer Edition 21.2.2全插件版+Crack下载链接(亲测可用,非钓鱼)

不知道为什么现在钓鱼的这么多(有答案的请在评论区上告诉我),就一个学习版的编曲软件有必要这样子搞吗?我也是在各类博客上找了一大堆教程,根本没几个能用的,索性直接到海盗湾上找了一个,发现可…

学习ArtTs -- 初见ArkTs

作者:Uncle_Tom 原文链接:学习ArtTs -- 初见ArkTs-云社区-华为云 1. 前言 需要静态分析去检查一个语言,必须对这个语言有深刻的认识,才能有效的对这个语言进行有效的检查。 我常说:“作为一个程序分析员需要比一般的程序员考虑…

移动端基础-vw适配

什么是vw 相对单位 相对视口的尺寸 vw:viewport width 换算 1vw1/100视口宽度 vw不需要向rem一样检查视口宽度 若视口宽为375px 1vw3.75px vw与vmin的区别 vmin更照顾横竖屏问题 1vw是视口宽度的100%,而vmin是找宽度和高度中最小的那个,这样横屏…

Ansible自动化工具(1)

目录 ansible的特性:. 二.部署ansible 管理端安装 ansible: ansible 目录结构: 管理主机上配置主机清单: ​编辑 配置密钥对验证: ansible 命令行模块 : 1.command 模块 指定 ip 执行…

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查 本套教程配套有录播课程和私教课程,欢迎私信我。 Docker部署ElasticSearch7 创建基本容器 docker run -itd --name elasticsearch -p 9200:9200 -e "discovery.typesingle-node" -e ES_JAVA_…

esp8266 步骤

安装驱动 http://arduino.esp8266.com/stable/package_esp8266com_index.json oled库 esp8266-oled-ssd1306

网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署,熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置,提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练,着重锻炼学生熟练…

网站不收录,与服务器不备案有关吗

随着互联网的快速发展,网站已经成为企业、个人和机构宣传和展示自己的重要平台。然而,许多网站在建设完成后却面临着不收录的问题,这给网站的管理者和拥有者带来了很大的困扰。其中,一些人认为,网站不收录的原因与服务…