草庐IT

力扣02 两数相加

PersistentYg 2023-03-28 原文

力扣02 两数相加

题目:

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

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

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

示例:

243

564

结果: 708

输入:L1 = [2,4,3]

​ L2 = [5,6,4]

输出:L = [7,0,8]

注:因为4+6=10个位是0十位是1所以要向前进1

解法一: 迭代法

解题思路:

定义一个变量为total用来存储两个数字相加的和,定义一个变量为next1用来存储total的十位上的数字也就是需要向前进的数字,可以先建立一个虚拟头结点,这个虚拟头结点指向真正的ListNode,这样ListNode 不需要单独处理,直接 while 循环即可。

代码:

/**
 * 根据力扣的题目要求,求两数之后并按要求返回。
 * 方法一:迭代法
 */
public class addTwoNumbers01 {
    //1.定义一个方法返回ListNode,方法参数为两个链表ListNode l1 l2
    public ListNode addTwoNumbers(ListNode l1,ListNode l2){
        //1.1定义一个int类型的total用来存储两个数字的和,定义一个next1用来存储 total/10 的值 就是要向前进的数
        int total = 0;
        int next1 = 0;
        //1.2定义一个链表 用来存储要返回的数字
        ListNode listNode = new ListNode();
        //1.3定义一个curNode用来标记当前节点
        ListNode curNode = listNode;

        //2.1先循环遍历l1与l2长度相等的情况
        while (l1 != null && l2 != null){
            //2.2将l1的节点的值加上l2节点的值再加上next1赋值给total
            total = l1.value + l2.value + next1;
            //2.3取出total个位上的数字赋值给当前节点的下一个节点
            curNode.next = new ListNode(total%10);
            //2.4取出total上的十位数就是要向前进的数
            next1 = total / 10;
            //2.5分别将l1 l2 与当前节点向前移一位
            l1 = l1.next;
            l2 = l2.next;
            curNode = curNode.next;
        }
        //3.1如果l1与l2长度不相等且l2先遍历完
        while (l1 != null){
            //3.2将l1的值加上next1赋值给total
            total = l1.value + next1;
            curNode.next = new ListNode(total % 10);
            next1 = total / 10;
            l1 = l1.next;
            curNode = curNode.next;
        }
        //4.1如果l2还没遍历完
        while (l2 != null) {
            total = l2.value + next1;
            curNode.next = new ListNode(total % 10);
            next1 = total / 10;
            l2 = l2.next;
            curNode = curNode.next;
        }
        //5.如果最后两个链表都遍历完之后还需要向前进位
        if (next1 != 0){
            curNode.next = new ListNode(next1);
        }
        return listNode.next;
    }
}

注:

/ : 整除的结果是两个数相除的整数部分不包括余数

% :取余的结果是两个数相除的余数部分不包括整数部分

示例: 10 / 7 = 1;10 % 7 = 3

解法二:递归法

解题思路:

最重要的就是要保证两个链表的长度相等,如果不相等我们也要想办法把它们变成相等(添加零节点)。

示例:

L1: 1 → 3 → 5 → 7 → 8 → 9

L2: 2 → 8 → 6 → 4 → 5

L :3 → 1 → 2 → 2 → 4

L2下一节点为空了补上零节点:

L2: 2 → 8 → 6 → 4 → 5 → 0

L : 3 → 1 → 2 → 2 → 4 → 0

根据规则还需要向前进1而L1,L2下一节点都为空所以都需要增加一个零节点

L1 :1 → 3 → 5 → 7 → 8 → 9 → 0

L2 :2 → 8 → 6 → 4 → 5 → 0 → 0

L : 3 → 1 → 2 → 2 → 4 → 0 → 1

代码:

/**
 * 使用递归法:每次保证两个链表的长度一样长,不一样的给补成一样长
 */
public class addTwoNumbers02 {
    //1.定义一个方法返回ListNode参数位ListNode l1,l2
    public ListNode addTwoNumbers(ListNode l1,ListNode l2){
        //2.定义两个int类型的变量分别存储两数之和以及需要向前进位的数
        int total = l1.value + l2.value;
        int next1 = total / 10;
        //2.1定义一个节点用来存放两数之和各位上的数字
        ListNode node = new ListNode(total % 10);
        //3.保证两个链表长度相等并且将next1的值与l1的值进行相加
        if(l1.next != null || l2.next != null || next1 != 0){
            //3.1如果l1或者l2下一个节点不为空就继续向前走但凡有一个为空就新建一个0节点连接在后面
            l1 = l1.next != null ? l1.next : new ListNode(0);
            l2 = l2.next != null ? l2.next : new ListNode(0);
            //3.2将next1的值与l1的值进行相加
            l1.value += next1;
            //3.3进行递归
            node.next = addTwoNumbers(l1, l2);
        }
        return node.next;
    }
}

注: next1的不再是加在total上而是与L1.value相加。

有关力扣02 两数相加的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  3. 【算法题解】20. 两数之和 - 2

    这是一道简单题题目来自:https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。提示:22nums.length104−109−109nums[i]109−109−109target109只会存在一个有效答案进阶:你可以想出一个时间复杂度小于O(n2)O(n^2)O(n2)的算法吗?示例1:输入:nums=[2,7,11,15],targe

  4. Ruby:为什么 1.025.round(2) 四舍五入为 1.02? - 2

    据我了解.round()-ruby中的功能将小数向上舍入,最后一个有效数字是5?例如1.5.round(0)#=>2(OK)但为什么1.025.round(2)#=>1.02而不是我期望的1.03?irb(main):037:0>1.025.round(2)=>1.02我该怎么做才能解决这个问题? 最佳答案 这与最后一位数字为5无关,与将十进制值转换为double浮点值有关。http://en.wikipedia.org/wiki/Double_precision_floating-point_format基本上,十进制数必须以有限

  5. Elasticsearch--02.Kibana8.1.0安装 - 2

    1.下载安装概述:Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。下载地址:Kibana8.1.0|Elastic解压到指定目录:tar-xzvfkibana-8.1.0-linux-x86_64.tar.gz-C/opt/module/2.Kibana生成证书文件在es服务器中生成证书、直接回车cd/opt/module/elasticsearch-8.1.0/bin/elasticsearch-certutilcsr-namekibana-dns

  6. 【愚公系列】2023年02月 微信小程序-Flex布局详解 - 2

    文章目录一、Flex布局详解1.Flex布局的概念1.1传统布局1.2Flex布局1.3Flex布局声明2.Flex布局的容器属性2.1flex-direction属性2.2flex-wrap属性2.3flex-flow属性2.4justify-content属性2.5align-items属性2.6align-content属性3.Flex布局的项目属性3.1order属性3.2flex-grow属性3.3flex-shrink属性3.4flex-basis属性3.5flex属性3.6align-self属性总结一、Flex布局详解1.Flex布局的概念1.1传统布局盒子模型:我们知道当并列

  7. 面试总结+力扣第二天刷题 - 2

    一.面试总结    4月20号下午进行了一场大数据视频面试,总结一下踩坑点:    1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。        这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。    2.要在面试10分钟前就进入面试的环境中,以防突发事件。    3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。    注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点

  8. 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 - 2

    最近更新的博客华为OD机试-数组合并(Python),真题含思路华为OD机试-最近的医院(Python),简单直白疑问搞懂,python中文词频统计,让你真能学会华为OD机试-最小传递延迟(Python)|代码编写思路+核心知识点字体反爬,一种来自字体设计师的跨行反爬案例|案例282023新华为OD机试题-事件推送(JavaScript)|刷完必过使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/category_12199275.html华为O

  9. 嵌入式UI框架 LVGL 学习笔记 02 页面管理和主题定制 - 2

    LVGL页面切换LVGL中没有明确的页面切换方案,参考(2.6#lvgl-多页面(screen)设定/切换)根据实际可用API,可以考虑两种方案:通过FLAG(LV_OBJ_FLAG_HIDDEN)隐藏或者显示lv_obj_add_flag/lv_obj_clear_flag根UI控件通过管理child节点的对象来实现lv_obj_set_parent/lv_obj_get_child通过屏幕显示obj切换lv_scr_load/lv_scr_load_anim与参考文章不同的是,这里更建议使用1和2两种方式进行管理。具体场景如下:如果是简单页面,没有标题,页脚,侧边栏等复杂元素,建议使用3。

  10. 02 openEuler操作系统的安装 - 2

    文章目录02openEuler操作系统的安装2.1openEuler操作系统的安装流程2.2openEuler操作系统的安装详细步骤2.2.1下载地址2.2.2创建虚拟机2.2.2.1方法一:典型配置2.2.2.2方法二:自定义配置2.2.3安装过程02openEuler操作系统的安装2.1openEuler操作系统的安装流程2.2openEuler操作系统的安装详细步骤本次介绍openEuler22.03-LTS基于X86架构的安装。2.2.1下载地址官网下载地址:https://www.openeuler.org/zh/download/根据你的实际需求选择适合架构平台的ISO系统镜像下载

随机推荐