LeetCode-AddTwoNumbers

本例代码下载地址:AddTwoNumber下载

题目描述:

在这里插入图片描述
大意是给定2个非负链表l1和l2,每个链表节点存储一个个位数字,整个链表代表一个高位在右的数字(即跟我们平时看到的数字相反)。将这样的2个链表相加组成的数相加的结果生成一个新的链表。

解决思路:

了解规则后看似挺简单的,2个链表按照从左到右的节点相加即可。这里需要注意几点细节:
1、给定2个链表都为空时的处理。
2、2个链表长度不同时的处理。
3、2个节点相加的值发生进位时的处理(关键)。

以下是图形帮助理解:
在这里插入图片描述

代码实现:
首先是节点的定义:

public static class ListNode {
       int val;
       ListNode next = null;
       ListNode(int x) { val = x; }
   }

具体实现:

public static ListNode  addTwoNumbers(ListNode l1, ListNode l2){
       // 空判断
       if (l1 == null && l2 == null) return  null;
       
       /**
        * 这里为什么不用0作初始化?
        * 因为题目中说明是2个非负整数,如果2个节点都是0相加,那么新节点也是0,就区分不出来了。
        * */
       ListNode newListNode = new  ListNode(-1);
       ListNode temp = newListNode;
       int carry = 0;                             // 进位值
       while (true) {        
           // 如果某个链表的节点为空而另一个不为空,
           // 则用0代替空节点的值,这样相加的值也是不为空的节点的值
           int v1 = l1 == null ? 0 : l1.val;
           int v2 = l2 == null ? 0 : l2.val;
           int sum = v1 + v2 + carry;             // 这里要注意加上上个计算的进位值
           carry = sum / 10;                   
           temp.val = sum % 10;
           
           if (l1 != null) l1 = l1.next;
           if (l2 != null) l2 = l2.next;
           
           if (l1 == null && l2 == null){
               break;
           }
           
           // 继续下个节点赋值
           temp.next = new ListNode(-1);
           temp = temp.next;
           
       }   
       // 如果最后的2个节点相加还有进位,则把进位值加上
       if (carry == 1){
           temp.next = new ListNode(carry);
       }
       return newListNode;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值