首页 > 编程语言 >LeetCode100之两数相加(2)--Java

LeetCode100之两数相加(2)--Java

时间:2024-11-15 19:17:49浏览次数:3  
标签:p2 p1 ListNode -- sum next 链表 Java 两数

1.问题描述

        给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 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
  • 题目数据保证列表表示的数字不含前导零

        难度等级

            中等

        题目链接

                两数相加

2.解题思路

        这道两数相加的题目,有点想我们小学的时候学的那个两个数的笔算,向加个位,再加十位,这样不断的加下去,大于10就进一。

        在正式开始相加之前,我们可以先做一个判断,如果其中一个链表为空,那就直接返回另一个链表就行了。

        //如果其中一个链表为空,直接返回另一个链表
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }

        接着,我们分别给两个链表定义一个用于遍历的指针,再给存储答案的链表定义一个头节点和遍历用的指针,因为相加会有进位,所以我们还需要一个存储进多少位的变量。

        //遍历两个链表的指针
        ListNode p1 = l1;
        ListNode p2 = l2;
        //答案链表的头结点
        ListNode data = null;
        //答案链表的指针
        ListNode p = null;
        //存储进位的位数
        int digit = 0;

        然后,我们就可以开始相加了。两个链表指针当前所指的节点的值相加,再加上今晚的值,就是当前位相加的总和,接着我们对这个总和做除法,除以10就得到要想下一位进多少位了。

            //计算两个节点的和
            int sum = p1.val + p2.val + digit;
            //更新进位信息
            digit = sum / 10;

        如果是第一次相加,答案链表这时候还是为空,我们要初始化答案链表,当前位的值是当前位相加的总和跟10取模,因为我们每一个位只能是0-9。同时更新答案链表的指针和两个相加链表的指针。

            //如果答案链表的头结点为空
            if(data == null){
                data = new ListNode(sum % 10);
                p = data;
            }
            //移动到下一位进行相加
            p1 = p1.next;
            p2 = p2.next;

        如果不是第一次相加,那么直接创建一个新的节点作为当前答案链表指针所指节点的下一个节点,值也是当前位相加的总和跟10取模,接着更新答案链表的指针和两个相加链表的指针即可。

                p.next = new ListNode(sum % 10);
                p = p.next;
                //移动到下一位进行相加
                p1 = p1.next;
                p2 = p2.next;

        当两个相加链表其中一个加完后,我们还需要将剩余的那个链表加到答案链表中。

         //如果链表1还有剩余的数
        while(p1 != null){
            int sum = p1.val + digit;
            digit = sum / 10;
            p.next = new ListNode(sum % 10);
            p = p.next;
            p1 = p1.next;
        }
        //如果链表2还有剩余的数
       while(p2 != null){
            int sum = p2.val + digit;
            digit = sum / 10;
            p.next = new ListNode(sum % 10);
            p = p.next;
            p2 = p2.next;
        }

        完成了两个相加链表的相加之后,我们还要注意检查最后还有没有进位,有进位的话,要将进位的那个节点不到答案链表中。

        //如果还要进位,则补充一个节点
        if(digit != 0){
            p.next = new ListNode(digit);
        }

        最后,返回答案链表的头结点即可。

3.代码展示

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //如果其中一个链表为空,直接返回另一个链表
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        //遍历两个链表的指针
        ListNode p1 = l1;
        ListNode p2 = l2;
        //答案链表的头结点
        ListNode data = null;
        //答案链表的指针
        ListNode p = null;
        //存储进位的位数
        int digit = 0;
        //开始相加
        while(p1 != null && p2 != null){
            //计算两个节点的和
            int sum = p1.val + p2.val + digit;
            //更新进位信息
            digit = sum / 10;
            //如果答案链表的头结点为空
            if(data == null){
                data = new ListNode(sum % 10);
                p = data;
            }else{
                p.next = new ListNode(sum % 10);
                p = p.next;
            }
            //移动到下一位进行相加
            p1 = p1.next;
            p2 = p2.next;
        }
        //如果链表1还有剩余的数
        while(p1 != null){
            int sum = p1.val + digit;
            digit = sum / 10;
            p.next = new ListNode(sum % 10);
            p = p.next;
            p1 = p1.next;
        }
        //如果链表2还有剩余的数
       while(p2 != null){
            int sum = p2.val + digit;
            digit = sum / 10;
            p.next = new ListNode(sum % 10);
            p = p.next;
            p2 = p2.next;
        }
        //如果还要进位,则补充一个节点
        if(digit != 0){
            p.next = new ListNode(digit);
        }
        //将结果返回
        return data;
    }
}

4.总结

        这道题给我的感觉就像小时候做的两位数加法的笔算,只是将笔算的过程用链表和代码模拟出来而已,需要注意的是,最后还要做一次是否要进位的判断,这里是一个小坑。好了,今天这道题就啰嗦到这,祝大家刷题愉快~

标签:p2,p1,ListNode,--,sum,next,链表,Java,两数
From: https://blog.csdn.net/2301_79318558/article/details/143605294

相关文章

  • 构造方法,static,final关键字,字符串拼接,基本数据类型、包装类转String,String转基本
    1.构造方法的特点1.每一个类都至少有一个构造方法,默认是无参的构造方法。一旦写了有参的构造方法,那么无参的构造方法就丢失了,需要自己显式的写出无参构造方法。一般只要是显式写出构造方法,无参的构造方法是必须要构造的。2、构造方法,方法名必须和类名保持一致,并且没有返回值,......
  • Android15音频进阶之input调节CarAudioService音量过程(九十四)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • 文件操作和IO
    文章目录一、认识文件1.1树型结构组织和目录1.2文件路径1.3其他相关知识二、java中操作文件2.1File概述1)属性2)构造方法3)方法代码示例三、文件内容的读写-数据流3.1InputStream概述1)方法2)说明3.2FileInputStream概述1)构造方法2)代码示例3)利用Scanner进行字符读取......
  • 多线程的入门与理解
    文章目录一、认识多线程1.1概念(1)线程是什么(2)为什么要有线程(3)进程和线程的区别(4)java的线程与操作系统线程的关系1.2第一个多线程程序1.3创建线程方法一继承Thread类方法二实现Runnable接口其他变形1.4多线程的优势二、Thread类及常见方法2.1Thread的常见构造方法2.2......
  • Java 21和Java 8在洛谷上的区别
    Java21默认开大内存很容易遇到所以如果换成Java8最后一个我也不知道为啥,有大佬帮忙看一下吗逆序对-洛谷importjava.util.*;publicclassMain{  staticScannercin=newScanner(System.in);  //非递归版本的归并排序,返回逆序对的数量  publics......
  • Linux常用命令之find命令详解
    find命令详解find是Unix和类Unix操作系统(如Linux和macOS)中一个非常强大的命令行工具,用于在文件系统中搜索文件和目录。find命令可以根据多种条件(如文件名、类型、大小、修改时间等)进行搜索,并可以执行复杂的操作。基本语法find命令的基本语法如下:find[路径]......
  • 计算机网络面试常见题型
    前言网络这方面是一名合格的运维工程师必须要掌握的,运维也就分几大块:网络运维、系统运维、桌面运维、应用运维。网络跟重要,十次面试就此问,而且还有专门招那种网络运维工程师的,薪资待遇也都不错。下面总结了近几年来常见的网络面试题。建议收藏!!面试题1、请描述TCP/IP协议中......
  • springboot毕设高校排课系统程序+论文
    系统程序文件列表开题报告内容研究背景随着高等教育的普及与深化,高校的教学管理工作日益复杂,尤其是课程安排这一环节,直接关系到教学质量与学生满意度。传统的手工排课方式不仅耗时费力,而且容易出错,难以满足现代高校对教学效率与灵活性的要求。近年来,信息技术的飞速发展,特别......
  • 第九章 DIV+CSS布局
    9.1DIV+CSS概述 DIV+CSS是Web设计标准,它是一种网页的布局方法。与传统中通过表格(table)布局定位的方式不同,它可以实现网页页面内容与表现相分离。DIV组成了网页的格局,CSS则装饰了格局,比如建一栋房子,开始的架子是DIV,架子搭建好后开始装饰,这个装饰就是CSS样式。用DIV+CSS布......
  • springboot毕设高校女生的饮食营养管理系统程序+论文
    系统程序文件列表开题报告内容研究背景在当今快节奏的社会中,高校女生面临着学业、就业及社交等多重压力,这些因素往往导致她们忽视饮食健康,进而影响身体健康与心理状态。随着健康意识的不断提升,越来越多的高校女生开始关注如何通过科学合理的饮食管理来改善体质、保持身材及......