【每日一题】2. 两数相加

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

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

你可以假设除了数字 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; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int flag  = 0;
        int count = 0;
        ListNode ans = new ListNode(0);
        ListNode now = ans;
        while(l1 != null || l2 != null) {
            int add1 = l1 == null? 0 : l1.val;
            int add2 = l2 == null? 0 : l2.val;
            int sum = add1 + add2 + flag;
            flag = sum/10;
            sum = sum%10;
            if(count == 0) ans.val = sum;
            else {
                    ListNode newNode = new ListNode(sum);
                    now.next = newNode;
                    now = newNode;
            }
            count++;
            if(l1 != null) l1 = l1.next; 
            if(l2 != null) l2 = l2.next;
        }
        if(flag != 0) {
            ListNode newNode = new ListNode(flag);
            now.next = newNode;
            now = newNode;
        }
        return ans;
    }
}

今天是一道中等题。实际上也不算很难,对链表结构有所了解基本上就可以处理。

看完题目。发现,欸,还是加法。这跟前几次的字符串加法,大数加法那些其实都差不多。而且,题目还很贴心,甚至链表都是倒序的。那就不需要再多处理什么,直接相加就行了。但,和字符串加法相同,都会出现两个数长度(位数)不一样的情况,所以需要判断,如果低位加完了,就使用0补高位。由于要返回链表头,所以链表头创建完就不要动了,用now来代替移动。只要l1或l2没有结束,就说明还要继续处理,进循环之后先判断,如果l1(l2)是空的,说明已经加完了,之后的位数需要使用0来补足。后面就是常规的计算了。加上前一位的进位就可以计算出这个位相加的结果。使用/10%10的基本操作来判断进位和余数。最后,如果加完flag还有数值,就说明有高进位,再处理一次就行了。(因为加法不可能产生n+2位数)。

虽说是中等题,实际上不难,大家争取拿下。如果有更好的解法也可以发在评论区。

相关推荐
ym hyd 1116 分钟前
慢性病精细化管理平台源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
程序猿乐锅11 分钟前
【黑马点评 | 第七篇】Redis 分布式锁的两种实现
java·数据库·redis·分布式·spring·缓存
SL_staff16 分钟前
JVS私有化交付为何敢承诺100%源码开放与无兜底风险?
java·低代码·全栈
需要82627 分钟前
MySQL MVCC 与事务隔离级别:从一条 update 看版本链
java·数据库·spring boot·mysql·spring cloud
Memory_荒年28 分钟前
订单超时未支付?从“定时扫库”一步步到最终形态
java·后端
多多爱学习36 分钟前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
续写烂尾1 小时前
MK SD NAND(贴片式TF卡)替代Nor Flash:1Gb容量与256Mb Nor
算法·microsoft
u0111026751 小时前
图片预览越来越占内存聊聊 URL.createObjectURL 的释放时机
图像处理·深度学习·算法·ai作画
Zane19941 小时前
同样是遍历图,为什么BFS能保证找到最短路径,DFS却不行
算法
无限码力1 小时前
2026华为OD机试真题 新系统 9月27日【坚果巧克力】
算法·华为od·华为od机考·华为od机试真题·华为od机试·华为od机考真题题解·华为社招笔试真题