leetcode刷题日记-【2. 两数相加】

49 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

题目描述

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

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

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

  image.png

示例 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
  • 题目数据保证列表表示的数字不含前导零

题目元素

  • 每个链表的val值在[0,9]之间,一个链表表示一个整数,单个链表所包含的节点数在[1,100]之间,计算两个链表的累加链表
  • 每个链表是按照逆序存储的,意思就是链表的最头部是数字的低,尾部是数字的高位。

解题思路

要对链表进行累加是从链表最头开始读取,然后将2个链表的当前值进行累加,没有的则计为0,大于十则向前进位。进位数为(x1+y1)/10,当前位置的新数值应该为(x1+y1)%10; x1对应第一个链表当前位置的数值,y1对应第二个链表当前位置的数值(注意此时链表1和链表二的循环层级应该保持一致);

还有个难点是除了代表数字0的链表值可以为0,其它数字如果最高位是0则直接去掉0; 如果当前层数时最后一层并且不是第一层且当前值为0时,直接忽略掉当前节点。

代码实现

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode res = new ListNode();
    countByNode(l1,l2,res,0);
    return res;
}

/**
 * 对两个链表进行累加
 * @param l1 第一个链表
 * @param l2 第二个链表
 * @param res 结果
 * @param carry 进位值
 */
private void countByNode(ListNode l1, ListNode l2, ListNode res, int carry) {
    int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
    // 新链表的值
    res.val = sum % 10;
    // 当前进位值
    carry = sum / 10;
    // 继续下次循环
    ListNode next = new ListNode();
    // 不要忽略还有种情况,当链表都为空,但是进位值有值时,仍然应该添加next链表
    if ((l1 == null || l1.next == null) && (l2 == null || l2.next == null) && carry == 0){
        return;
    };
    res.next = next;
    countByNode(l1 != null ? l1.next : null,l2 != null ? l2.next : null,next,carry);
}