leetcode第2题,两数相加

前言

前段时间陆陆续续刷了一波leetcode题,发现挺有意思,用来打发时间还是挺不错的,这里记录一下已经做过的部分题目,参考了网上的一些解题过程和解决思路,方便回看

题目描述

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

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

你可以假设除了数字 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]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

代码思路分析

这个题tm的看了好几遍了,当时每次都没完全看明白,今天一看原来着么简单,这里分析一下逻辑,这里整数相加有进位一说,进位值无非就两个,要么是0,要么是1,刚开始肯定是0,先设置一个进位值carry为0,然后这里要设置两个节点去处理,一个是头节点,一个是尾节点,,一开始两个节点都为空

两者刚开始肯定都是空,然后判断两个节点是否有一个不为空,如果不为空,那么进入进一步判断,设置两个int变量,如果任意一个链表不为空,则把当前节点的值赋值给int变量,否则设置为0,

然后设置sum值为当前两个节点的值与节点值的和,一开始判断头节点是否为空,这种情况相当于第一次进入循环,此时两个节点的值赋值为sum%10,每次sum的取余就是当前位置要赋值的部分,比如4和7,那么当前位置就是1,如果头结点不为空,说明开始进入第二次循环,此时只有tail节点进入活跃状态,需要tail指针不断右移,那么需要使用下面两行代码

tail.next=new ListNode(sum%10)

tail=tail.next;


这是相当于尾指针不断右移,

在while循环外边设置进位值为0,然后此时,设置进位值为 sum/10,不断更新

然后判断两个链表是否为空了,如果不为空,继续右移,,当整个循环结束后,判断此时的进位值是否为1,如果是1,那么需要进位 ,此时tail为最后一个节点,此时将进位值作为tail的下一个节点即可,最后返回head即可

代码实现

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head=null,tail=null;
        int carry=0;
        while(l1!=null || l2!=null){
            int n1=l1!=null?l1.val:0;
            int n2=l2!=null?l2.val:0;
            int sum=n1+n2+carry;
            if(head==null){
                head=tail=new ListNode(sum%10);
            }else{
                tail.next=new ListNode(sum%10);
                tail=tail.next;
            }
            carry=sum/10;
            if(l1!=null){
                l1=l1.next;
            }
            if(l2!=null){
                l2=l2.next;
            }
        }
        if(carry>0){
            tail.next=new ListNode(carry);
        }
        return head;
    }

注意事项

1,通过%10用来获取当前位置要展示的值
2,通过/10 来获取进位值
3,这里注意最后一次进位值是否为1来决定是否做特殊处理

实现效率

9:42	info
		解答成功:
		执行耗时:1 ms,击败了100.00%Java用户
		内存消耗:41.3 MB,击败了10.54%Java用户
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦岚如雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值