leetcode每日一刷

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807

       题目提示我们是两个非空的链表,因此我们可以选用链表结点的方法解决此题。我们先来说说此题的思路以及要考虑的因素:

思路:首先要创建一个空链表用来存放结果。两个逆序存储的链表,因此其链表头部指针所指依次为其表示数字的个位、百位、千位,依次类推。而在我们数学意义上的两个非负整数的相加正是从个位、百位,从低位开始相加,低位满十则向高位进一,对应到两个数据链表中由一个指针从表头开始,将两个数据链表对应位置的val相加,得到的结果即为对应结果链表结点的val。在此过程中我们要注意以下几个问题

若对应val相加得到的sum结果大于十,此时我们要将sum做%处理来存储到新链表中。除此之外,向前进位操作我们通过sum/10来实现,参与到下一位置的计算中,代码片段如下:其中carry表示向下一位置进位的值。

ListNode root=new ListNode();
        ListNode cursor=root;
        int carry=0;
        while (l1!=null && l2!=null){
            int sum=l1.val+l2.val+carry;
            cursor.next=new ListNode(sum%10);
            carry=sum/10;

            l1=l1.next;
            l2=l2.next;
            cursor=cursor.next;
        

当进行到两个链表中较短链表中最后一位时(这里假定两个链表不等长,实际上等长是一个道理),我们可以引入结点overplus代表较长的一个链表来继续进行将剩余元素赋予到结果链表:

ListNode overplus=null;
        overplus=l1!=null?l1:l2;
        while (overplus!=null){
            int sum=overplus.val+carry;
            cursor.next=new ListNode(sum%10);
            carry=sum/10;
            overplus=overplus.next;
            cursor=cursor.next;
        }

当进行到较长链表的最后一位时,我们还要考虑最后一位的进位问题,即判断进位carry是否为0,不为0则继续进位:

if(carry!=0){
            cursor.next=new ListNode(carry);
        }

以下是完整代码:

 public  ListNode addTwoNumbers(ListNode l1, ListNode l2){
        ListNode root=new ListNode();
        ListNode cursor=root;
        int carry=0;
        while (l1!=null && l2!=null){
            int sum=l1.val+l2.val+carry;
            cursor.next=new ListNode(sum%10);
            carry=sum/10;

            l1=l1.next;
            l2=l2.next;
            cursor=cursor.next;
        }

        ListNode overplus=null;
        overplus=l1!=null?l1:l2;
        while (overplus!=null){
            int sum=overplus.val+carry;
            cursor.next=new ListNode(sum%10);
            carry=sum/10;
            overplus=overplus.next;
            cursor=cursor.next;
        }
        if(carry!=0){
            cursor.next=new ListNode(carry);
        }
        return root.next;

    }

提交结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值