每日一题: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;

    }
}
相关推荐
一碗白开水一14 分钟前
【第19话:定位建图】SLAM点云配准之3D-3D ICP(Iterative Closest Point)方法详解
人工智能·算法
编码浪子16 分钟前
趣味学RUST基础篇(函数式编程闭包)
开发语言·算法·rust
渣哥18 分钟前
Java HashMap 扩容机制详解:触发条件与实现原理
java
赵星星52018 分钟前
Spring Bean线程安全陷阱:90%程序员都会踩的坑,你中招了吗?
java
Want59535 分钟前
C/C++圣诞树②
c语言·c++·算法
得物技术1 小时前
0基础带你精通Java对象序列化--以Hessian为例|得物技术
java·后端·编程语言
橘子在努力1 小时前
【橘子SpringCloud】OpenFegin源码分析
java·spring boot·spring·spring cloud
我是廖志伟1 小时前
JVM新生代Eden区域深度解析
java·jvm·memory management
十八旬1 小时前
苍穹外卖项目实战(day7-2)-购物车操作功能完善-记录实战教程、问题的解决方法以及完整代码
java·开发语言·windows·spring boot·mysql
BIGSHU09231 小时前
java多线程场景3-并发处理和异步请求
java·开发语言·python