每日一题:LeetCode2.两数相加

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

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

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

草图:(对照上面图片例子)

java 复制代码
/**
 * 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; }
 * }
 */

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

/**
 * 典型的竖式加法模拟题:首先个位相加,其次十位,百位,千位...每次加的时候逢十进一
 */
public class AddTest {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //首先,对链表题目有一个虚拟的头结点
        ListNode dummyHead = new ListNode(-1);
        //令当前的指针等于虚拟头结点
        ListNode cur = dummyHead;
        //设置一个进位temp
        int temp = 0;//进位一开始等于0
        //依次重复这个过程,条件:第一个链表里边有数,或者第二个链表里面有数,或者当前进位不等于0!
        while (l1 != null || l2 != null || temp != 0) {//tmep!=0 是如果最后一次刚好进位上去就把进位位写到逆序的最后一位
            //首先拿到第一个链表种要加的数
            int val1 = l1 == null ? 0 : l1.val;//如果链表一为空直接返回0,否则就返回链表一中的值
            int val2 = l2 == null ? 0 : l2.val;//同理(三元运算符)
            //两个数相加每一次都要考虑之前的进位(如果存在也就是进位不为0)
            temp += val1;//将链表一的值加到进位位里
            temp += val2;//再将链表二的值加到进位位,实现了对应位数上相加再加上进位
            //声明当前要存放的数字的结点:存放的值应该是temp对10取模的结果
            ListNode node = new ListNode(temp % 10);
            //然后当前指针就指向下一个结点 c的位置-1 -》 0 ,值变成了8
            cur.next = node;
            //每一次将当前结点指向下一个结点的时候,当前结点也要向后(逆序)移动一个位置
            cur=cur.next;
            //temp就应该向前进位了 temp除以10  temp/10 -> 表示进位是0(小于10)或者1(大于10)
            temp = temp / 10;//temp / =10
            //此时考虑链表1不为空链表1就往前进位  l2同理
            if(l1!=null){
                l1=l1.next;
            }
            if(l2!=null){
                l2=l2.next;
            }
        }
        //最后将虚拟的头节点的next返回即可
        return dummyHead.next;

    }
}
相关推荐
雪的季节5 分钟前
Python 线程同步与异步编程 全解析
java·开发语言
吃饱了得干活17 分钟前
缓存与数据库一致性:从理论到实战
java·后端·面试
txzrxz20 分钟前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq23 分钟前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
520拼好饭被践踏24 分钟前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪35 分钟前
Java虚拟机:堆的参数配置
java·开发语言·jvm
霸道流氓气质38 分钟前
SpringBoot中使用JasperReports 报表引擎 — 介绍、原理与使用实践
java·spring boot·后端
花生了什么事o43 分钟前
DDD 分层架构:六层分层架构
java·架构·ddd
Y3815326621 小时前
3 种 SERP 数据处理方案对比:流式 / 批处理 / 缓存
java·spring·缓存
闪电悠米1 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵