leetcode - [2]两数相加|刷题打卡

375 阅读3分钟

leetcode - [2]两数相加|刷题打卡

​ 我是通过idea的leetcode插件获取题目做题的,所以题目描述基本都会有注释符号哈

1. 题目描述

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

2. 思路分析

​ 看到这道题,我的初始想法就是直接遍历每一位,然后加起来,毕竟人家都帮你排好了。不过有几个比较需要考虑的点:

  1. 如果当前的两个 ListNode 对应的节点值相加起来大于10,那就要进位到下一个循环
  2. 如果两个 ListNode 的位数不一样,意味着这个 ListNode为null,需要当做0处理

​ 主要注意上面两点之后,就可以开始敲代码尝试了

3. AC代码

public class No2 {

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode re = new ListNode();
        getSum(re, l1, l2, 0);
        return re;
    }

    /**
     *   // 执行用时:
     *     //2 ms
     *     //, 在所有 Java 提交中击败了
     *     //99.92%
     *     //的用户
     *     //内存消耗:
     *     //39 MB
     *     //, 在所有 Java 提交中击败了
     *     //43.23%
     *     //的用户
     */
    public static void getSum(ListNode re, ListNode l1, ListNode l2, int plus) {
        // 结束条件,相加的两个都没有下一个节点了
        if (l1 == null && l2 == null) {
            // 如果节点的最后一位相加过10,则加回去
            if(plus != 0) {
                re.val = plus;
            }
            return;
        }

        // 可能存在某一个节点已经空了
        int l1Val = l1 == null ? 0 : l1.val;
        int l2Val = l2 == null ? 0 : l2.val;
        int sum = l1Val + l2Val + plus;
        int val = sum % 10;
        plus = sum / 10;

        re.val = val;

        // 空传空, 为空就传下一个
        l1 = l1==null?l1:l1.next;
        l2 = l2==null?l2:l2.next;

        // 两个节点有一个非空,或者值过10 ,返回结果需要多一位
        if (l1 != null || l2 != null || plus == 1) {
            re.next = new ListNode();
        }
        // 还没结束,继续遍历
        getSum(re.next, l1,l2, plus);
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(9, new ListNode(9, new ListNode(9, new ListNode(9))));
        ListNode l2 = new ListNode(9, new ListNode(9, new ListNode(9)));

        ListNode re = addTwoNumbers(l1, l2);
        System.out.println(re);
    }
}

// 题目提供的表结构
class ListNode {

    int val;

    ListNode next;

    ListNode() {}

    ListNode(int val) { this.val = val; }

    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

4. 总结

​ 做题思路对了只是一半,调试还要调很久

​ 要细 细~~~


​ 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情