两数相加

02.两数相加

题目如下

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

第一次做这个题是在五个月之前,然而昨天还是没有用到简单的方法解决问题,所以在此总结一下,提醒自己学会总结

看题目要求是两数相加,而且链表的顺序也是逆序,从个位开始,一开始很容易想到的是两个链表同时遍历,然后相加,判断是否大于9,如果说大于9 的话说明要进位,然后把进位的1留给下一次相加。不过在处理的时候遇到了点问题,就是说过于冗长,逻辑处理不够清晰。遂去看官方解析。具体分析代码如下

package es.other.face;

import leetcode.链表.ListNode;

/**
 * @author lc
 * @date 2020-12-18 8:56
 */
public class AddTwoNumbers {
    ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //官方这里用一个carry记录了一下进位的数
        int carry = 0;
        //新建一个链表用来接收两个链表相加,虚拟头节点,方便后边处理
        ListNode currentNode = new ListNode(-1);
        //因为current一直在往后走,所以头节点需要保存一下,也就是最后需要返回的节点
        ListNode resNode = currentNode;
        while (l1 != null || l2 != null) {
         //这里很巧妙,因为官方并没有要求两个都为空才进入循环,所以就判断一下是否为null,null的话就将值设为0,因为相加嘛,
         //0的意思就是没有,相当于用0补齐了位数。这样就简化了逻辑,不用判断l1为空l2怎么处理,l2为空l1怎么处理,
         //我就是在这被陷住,导致逻辑变的复杂。
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            //这里就更巧妙了 利用两数之和再加上carry,也就是上次相加进位的数 其实也就是1 这一个就是这一次循环相加的总值
            int sum = x + y + carry;
           //直接整除10,不大于10肯定会得到0,大于等于10就会得到1(不会大于20),也正好是进位的数,
            //用除法代替减法,也省去了逻辑判断,非常巧妙
            carry = sum / 10;
            //这里用求余的方式代替减法同时替代逻辑判断是否大于9,真是妙极了 得到的结果就是所求总和的个位数
            int num = sum % 10;
            //这里就是将得到的num构造成节点追加到后边,然后current节点后移一位
            currentNode.next = new ListNode(num);
            currentNode = currentNode.next;
            //判断,因为进入循环的要求是两个链表之一不为空就行,所以需要对每个链表都进行判空 然后不为空再往后移一位
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        //循环结束后看carry是否大于0 大于0 的意思就是最后一次相加发生进位,所以需要新建一个节点为carry,其实也就是1
        if (carry > 0) {
            currentNode.next = new ListNode(carry);
        }
        return resNode.next;
    }
}

到此结束,不得不说智商真是个好东西,可惜我没有。。。。小鸡小鸡快点跑。

posted @ 2020-12-18 09:40  小鸡小鸡快点跑  阅读(127)  评论(0)    收藏  举报