Leetcode - 两数相加 M[2]

news/2024/7/5 11:20:13

问题描述

 

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
     题目数据保证列表表示的数字不含前导零

  看到题目,我的第一思路是将链表存储的数还原出来并相加,之后就被 10000000000 教育了,即使将存储数据的数据类型改变依然出错。之后开始改变思路。

链表存储的整数是倒序存储的,那么最后一位必定是 个位,之后的位数依次递增,而相同位置的数是可以相加的,据此我们可以倒序得到一条表示和的链表。

需要考虑的问题:

        1. 进位问题

        2. 链表长度不一

算法:

        设置一个表示进位的变量 preAdd,用于判断是否要+1,

        同时遍历两条链表,将相同位数上的数字相加,相加的数为 v1 + v2 + flag, 链表指定结点存储的 val 值为 :(v1 + v2 + flag) % 10

        进位为:(v1 + v2 + flag)/ 10; 

        另外,我们需要考虑在循环结束 preAdd = 1 的情况。

ps:  链表的长度不一,循环过程中其中一条链表有可能先结束是变量指向null,我们需要考虑这些情况以便位数相加。

代码 

        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode node = null;
            ListNode pre = null;
            int preAdd = 0;
            while (l1 != null || l2 != null) {
                int v1 = l1 == null ? 0 : l1.val;
                int v2 = l2 == null ? 0 : l2.val;
                int sum = v1 + v2 + preAdd;
                if (pre == null) {
                    node = pre = new ListNode(sum % 10);
                } else {
                    pre.next = new ListNode(sum % 10);
                    pre = pre.next;
                }
                preAdd = sum / 10;
                /* 向后 */
                if (l1 != null) {
                    l1 = l1.next;
                }
                if (l2 != null) {
                    l2 = l2.next;
                }
            }
            if (preAdd > 0) {
                pre.next = new ListNode(preAdd);
            }
            return node;
        }

            while (l2 != null) {
                int sum = l2.val + preAdd;
                pre.next = new ListNode(sum % 10);
                pre = pre.next;
                preAdd = sum / 10;
                l2 = l2.next;
            }
            if(preAdd > 0){
                pre.next = new ListNode(preAdd);
            }
            return node;

 

执行结果


http://www.niftyadmin.cn/n/4557802.html

相关文章

Leetcode - 合并两个有序数组 E[88]

问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。注意&#xff1a;最终&#xff0c;合并…

Leetcode - 二进制求和 E[67]

题目描述 给你两个二进制字符串&#xff0c;返回它们的和&#xff08;用二进制表示&#xff09;。 输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a "11", b "1"输出: "100" 示例 2: 输入: a "1010", b "1011" …

抽象类的继承

接口中有定义的方法 具体方法功能代码可以不写&#xff09;如果是继承接口 也要把方法名照写上 即使不知道具体干某些事情 具体干某些事情 就必须对抽象类中的每个方法都进行实现(换种说法就是具体化 abstract class cWeapon{ int damage; abstract int setDamage(); abstract …

Leetcode - 无重复字符的最长字串 M[3]

问题描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2:输入: s "bbbbb"输出: 1解释: 因为无…

asp.netmvc 三层搭建一个完整的项目

接下来用 asp.net mvc 三层搭建一个完整的项目&#xff1a; 架构图: 使用的数据库: 一张公司的员工信息表&#xff0c;测试数据 解决方案项目设计&#xff1a; 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) 当然还可以加上comm…

eclipse 编的java程序运行后显示问号

在Resource中把编码改成GBK或者是GB2312 ||| 改为GB2312 或者 GBK 就不会了 选中properties属性 你右键单击该类 在右边选择GBk 答案补充 直接输入GBK就行了 答案补充 选择下面的others ||| 在我这里都没错啊 然后找到resource 选择Properties 然后找到你的文件点击右键 在reso…

Leetcode - 杨辉三角II E[119]

问题描述 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1:输入: rowIndex 3输出: [1,3,3,1] 示例 2:输入: rowIndex 0输出: [1] 示例 3:输入: rowIndex 1输出: [1,1] 提…

JAVA的 计机二级 那个网站有<南开一百题>买

cid2F35BFABE23E23FFCF1629CD90A9223FB4FAD7DC&t2&fmt- 答案补充 淘宝上多的是 cid8FF7C259950B06053CC5E9A71270E178E387F7AB&t13&fmt-下种子 答案补充 java :http://119.147.41.16/down 迅雷http://119.147.41.16/down