力扣算法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]

注意事项

定义链表ListNode时,

  1. 链表的首个值不能为0,当首个参数为0时,代表着链表为空。
  2. 只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。此时需要xx.next才能真正的指向他的header
  3. 不需要定义长度 。

赋值时

  1. 通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。
  2. 通过一个链表指向原链表地址,赋值完成时,打印原链表的指针地址。获取所有值。

取值时

  1. 取第一个值时,只需要xx.val即可。
  2. 取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。

解决方法

模拟法

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode number1 = new ListNode(0); // 用来定义一个空的链表
        ListNode number2 = number1; // number2为目标链表
        // 定义进位
        int carry = 0;
        /**
         * 首先要明白 他是按照逆序的方式存进来的 也就是说同位置可以相加,
         * 相加的结果就是两个数之和加上进位
         * 
         * 举个例子:l1{2,0,4},l2{4,8,6},
         * 那么他们相同的位置就是 2+4+carry,0+8+carry,4+6+carry
         * 
         * 如果一个长一个短,那么短的就可以采取末尾补零的方法,这样不影响数值
         */
        while (l1 !=null || l2 != null){
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;

            // 计算相同位置的和
            int sum = x + y + carry;

            // 进位就是两数的和与10 取整
            carry = sum / 10;

            // 存进去的数就是两数之和与10 取余
            sum = sum % 10;

            if (number1 == null) {
                number1 = number2 = new ListNode(sum);
            }else {
                number2.next = new ListNode(sum);
                number2 = number2.next;
            }

            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        /**
         * 假如最后两个数相加之后大于10,那么进位就等于1,此时要把这个位数放到目标链表中
         */
        if(carry == 1){
            number2.next = new ListNode(carry);
        }
        return number2.next;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值