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

    }
}
相关推荐
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯5 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路9 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
先吃饱再说10 小时前
判断回文字符串,从一行代码到双指针优化
算法
像我这样帅的人丶你还12 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
黄敬峰13 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
plainGeekDev14 小时前
GreenDAO → Room
android·java·kotlin
得物技术14 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六17 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程