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

    }
}
相关推荐
CoderYanger42 分钟前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE3 小时前
11.7[高体】
java·后端·spring
apcipot_rain4 小时前
C++转Java日记(04)
java·开发语言·c++
NEFU_Jyj5 小时前
牛客周赛R168
算法
特立独行的猫A5 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白6 小时前
LangGraph4j 实战(下)
java
天诰7 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
这个昵称不容易10 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长11 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊12 小时前
LeetCode2221~2240题目解析
java·leetcode