LeetCode 第二题 javascript实现

 

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

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

 

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/add-two-numbers

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

事先准备

 var newList = null , p , q , carry = 0 , m;
    p = l1 , q = l2;

  newList = null()(用来返回的链表) , carry = 0(表示进位,初始化进位是0) , m(用来遍历链表);

首先大体上分三种情况

l1长度等于l2

l1长度大于l2 (q到头了)

l1长度小于l2(p到头了)

最后处理一下如果运算到最后carry不为0(最后一个数有进位)  ,那么最后一次的进位要拿出来单独处理

 

l1长度等于l2

l1:[ 1 , 2 , 5]

l2:[ 2 , 9 , 5]

  var add = q.val + p.val + carry;

p和q指向的单元的val值相加 ,然后还得加上进位,这个进位指的是前一对数的进位  比如l1的[1] , l2的[2] ,他们的前一个进位carry初始化的时候已经设置为0了

  var result = add % 10 ;
        carry = add >= 10 ?  Math.floor(add / 10) :  

 result是你要插入到链表的值 , add 如果是超过10要取模运算 ,接着carry是我们要设置下一次的进位

设置完下一次的进位之后就可以创建链表将result插入了,插入的是尾节点 注意插入的方法就行了

  var head = new ListNode(result);
        if(newList == null) {
            newList = head;
        } else {
            m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
       
        }

最后就是去往下一组

   p = p.next;
        q = q.next;

 

显然上面只能判断到两个长度相同的,如果不同了之后,就意味着p或q 有一个已经到头了,另外一个还没有到头

l1长度大于l2 (q到头了)

到头了之后,add = p.val+carry   加carry是因为如果前面相等时候的最后一次运算carry有进位 ,接下来和上面的结构差不多

 while(p != null) {
        var add = carry + p.val;
        var result = add % 10 ;
        carry = add >= 10 ?  Math.floor(add / 10) :  0;
        var head = new ListNode(result);
        if(newList == null) {
            newList = head;
        } else {
             m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
        }
        p = p.next;
    }

l1长度小于l2(p到头了) 和上面的q到头一样理解

 

最后如果是 l1 = l2  ,那么最后一次的进位要拿出来单独处理

这是在处理如果是运算完之后carry必须要保证是0 , 如果不是0  那就说明在加的过程中最后一位进位了 , 所以要再将这个进位的数插入到链表

 if(carry > 0) {
          var head = new ListNode(carry);
           m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
    }

最后将newList返回出去就可以了

完整代码(代码的重复有点多,可以弄的简洁一点,插入节点封装成一个函数,这里没有优化)

var addTwoNumbers = function(l1, l2) {
    var newList = null , p , q , carry = 0 , m;
    p = l1 , q = l2;
    while(p != null && q != null) {
        var add = q.val + p.val + carry;
        var result = add % 10;
        carry = add >= 10 ?  Math.floor(add / 10) :  0;
        var head = new ListNode(result);
        if(newList == null) {
            newList = head;
        } else {
            m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
            // head.next = newList;
            // newList =head;
        }
        p = p.next;
        q = q.next;
    }
    while(p != null) {
        var add = carry + p.val;
        var result = add % 10 ;
        carry = add >= 10 ?  Math.floor(add / 10) :  0;
        var head = new ListNode(result);
        if(newList == null) {
            newList = head;
        } else {
             m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
        }
        p = p.next;
    }
     while(q != null) {
        var add = carry + q.val;
        var result = add % 10 ;
        carry = add >= 10 ?  Math.floor(add / 10) :  0;
        var head = new ListNode(result);
        if(newList == null) {
           newList = head;
        } else {
            m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
        }
        q = q.next;
    }
     if(carry > 0) {
          var head = new ListNode(carry);
           m = newList;
            while(m.next != null) {
                m= m.next;
            }
            m.next = head;
    }
    return newList;
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值