LeetCode两数相加

每日LeeCode——2. 两数相加

难度中等5238收藏分享切换为英文接收动态反馈

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

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

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

示例:

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

​ 将两个链表看成是相同长度的链表进行从头到尾的遍历,根据加法的从低位开始算起,就是从链表的表头开始算起,取出两个链表中的低位进行 ”+“运算,考虑进位问题设置变量temp来代表进的位数则:

int sum = (l1.val+l2.val+temp)%10;

sum代表了当前位的值,而进位数temp则是:

temp = (l1.val+l2.val+temp)/10;

此时建立新结点node用来存储当前位的值并插入链表当中,循环进行上述步骤,当 l1 或者 l2 其中一个为空时,就用0来代替:

 int a = l1!=null?l1.val:0;
 int b = l2!=null?l2.val:0;

直到循环结束。在判断最后是否要进位。

代码1
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);			//创建头结点以便于操作
        ListNode p = pre;						//
        int temp = 0;
        while(l1 != null || l2 != null) {
            int a = l1 == null ? 0 : l1.val;
            int b = l2 == null ? 0 : l2.val;
            int sum = a + b + temp;
            
            temp = sum / 10;
            sum = sum % 10;
            p.next = new ListNode(sum);
            p = p.next;
            
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(temp == 1) {						//判断最高位是否要进位
            p.next = new ListNode(temp);
        }
        return pre.next;	
    }
代码2
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
      return add(l1,l2,0);
    }
    
    public static ListNode add(ListNode la,ListNode lb,int temp){
        if(la==null&&lb==null&&temp==0){
            return null;
        }
        int a = la!=null?la.val:0;
        int b = lb!=null?lb.val:0;
        int c = a+b+temp;
        ListNode LC = new ListNode(c%10);
        LC.next = add(la!=null?la.next:null,lb!=null?lb.next:null,c/10);
        return LC;
        
   }

如有问题,还请指正。

参考:画解算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值