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

    }
}
相关推荐
weixin_46242847几秒前
使用 Caffeine 缓存并在业务方法上通过注解实现每3到5秒更新缓存
java·缓存
程序媛小果2 分钟前
基于java+SpringBoot+Vue的桂林旅游景点导游平台设计与实现
java·vue.js·spring boot
骑鱼过海的猫1234 分钟前
【java】java通过s3访问ceph报错
java·ceph·iphone
杨充10 分钟前
13.观察者模式设计思想
java·redis·观察者模式
Lizhihao_12 分钟前
JAVA-队列
java·开发语言
算法歌者15 分钟前
[算法]入门1.矩阵转置
算法
喵叔哟21 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟21 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk24 分钟前
maven环境搭建
java·maven
林开落L29 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode