leetcode-两数相加

238 阅读2分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

今天抽出时间来继续做做leetcode的题,第2题两数相加,难度是中等,比昨天的两数之和要高,但是实际完全水题,从头到尾完全不用拐弯。

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

addtwonumber1.jpg

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

思路

本质上,就是2个用数组来存储的数字进行求和。这题比一般的数组数字求和还简单一些,因为都是反向存储的,所以,直接个位、十位、百位不断向上推都是对齐的,连找到小数点把数位对齐的操作都不需要,直接从第一位(最低位)开始,逐位按位相加就好,思路如图所示

简易.png

注意点

有2个注意点:

  1. 2个数字可能长度不相等,对应为取不到的时候,默认为0
  2. 相加注意进位,特别是最大的位,可能2个数在这一位都空了,但是因为上一位相加有进位,所以还会多出一位

进位.png

Java版本代码

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 返回结果,即头结点
        ListNode result = null;
        // 当前节点,next节点就挂载在当前节点后面
        ListNode current = null;
        // 进位
        int carry = 0;
        while (l1 != null || l2 != null) {
            // 默认为0
            int val1 = 0;
            // 如果l1不为空,就是用l1的val
            if (l1 != null) {
                val1 = l1.val;
            }
            // val2做同样处理
            int val2 = 0;
            if (l2 != null) {
                val2 = l2.val;
            }
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            sum %= 10;
            if (result == null) {
                result = new ListNode(sum);
                current = result;
            } else {
                ListNode next = new ListNode(sum);
                current.next = next;
                current = next;
            }
            // l1和l2都指向各自的下一个节点
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            ListNode next = new ListNode(carry);
            current.next = next;
        }
        return result;
    }
}