每日打卡:两数相加

123 阅读3分钟

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

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

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

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

输入: l1 = [2,4,3], l2 = [5,6,4]

输出: [7,0,8]

解释: 342 + 465 = 807.

原题链接

回到梦开始的地方,做了好多各种各样的题,突然回到这种逻辑题的时候还有些不适应

我们注意,他题中的描述,就是我们的数字他就只能有一位,而且他是倒序的形式,那说白了,不就是让我们一点一点的相加吗?我们就只需要使用一个变量去维护我们的进位,如果学过一点点汇编,那就很好理解了。

首先,第一个问题就是我们为什么要创建两个节点,我最开始创建的是一个,这也是我在做题的过程中所踩到的坑,一个节点是我们用来相加之后保存我们的数,但是这是链表,不是数组,我们再加到最后的时候,我们用于保存的节点也在链表的最后端,我们还需要一个头节点去维护我们的起始位置,用于返回

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
      ListNode ret=null,head = null;
        int cv = 0;
        //只要两个链表有一个不为空,循环就继续
        while (l1 != null||l2 != null){
            //用两个变量去保存我们节点中的数值,如果节点为空,我们就用0去代替
            int n1= l1 != null ? l1.val : 0 ;
            int n2= l2 != null ? l2.val : 0 ;
            int sum = n1 + n2 + cv ;
            //我们第一次进入循环,我们一起创建两个节点
            if(head==null){
                head = ret = new ListNode(sum % 10);
            }else {
            //第二次之后的循环都在这里运算,因为我们第一次创建的是自身,我们第二次就要创建下一个
            //如果我们不创建,那我们下一个指向的就是空
            //如果不在if中,我们就会创建两次
                ret.next = new ListNode(sum % 10);
                ret = ret.next;
            }

            cv = sum/10;
            if(l1!=null){
                l1=l1.next;
            }
            if(l2!=null){
                l2=l2.next;
            }
        }
        //再循环结束之后,我们如果进位器不为零,就是我们最后一位进位,我们将他保存在最后
        if(cv>0){
            ret.next = new ListNode(cv % 10);
        }
        return head;
    }

一道几乎没有多少算法知识的题,多数靠的就是我们逻辑思维能力,这可能就是,好多人做的第一道题,难度不大,就是我们在清理思路的过程中,我们不要忘记我们的进位器,因为使用的是链表,所以我们还需要注意,每一个节点都需要new,不然就会出现null