给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
};