给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1、方法一:暴力法(超出时间限制)
获取L1和L2的数字,得到和之后构建链表
Js中创建指针的方法是new
ddTwoNumbers = function(l1, l2) {
let a = new ListNode(), b = new ListNode();
let i = 1, j = 1, jia1 = 0, jia2 = 0, jia = 0;
//获取l1的数值
for(a.next = l1.next;a.next!=null;i++){
jia1 += a.val*Math.pow(10,i);
}
//获取l2的数值
for(b.next = l2.next;b.next!=null;j++){
jia2 += b.val*Math.pow(10,j);
}
//l1+l2的和
jia = jia1 + jia2;
//新建链表
let sum = new ListNode();
//创建头指针
let head = sum;
let num = 0;
while(jia){
num = jia % 10;
let newnum = new ListNode();
newnum.val = num;
head.next = newnum;
jia /= 10;
head = newnum;
}
};
2、方法二:边扫描边相加(内存消耗较大)
var addTwoNumbers = function(l1, l2) {
let k,l=0;
let link = new ListNode();
let head = link;
while(l1 && l2){ //把l1和l2有数相加的部分处理了
k = l1.val + l2.val;
if(l==1){
k+=1;
l=0;
}
if(k>=10){
l=1;
k-=10;
}
let n = new ListNode();
n.val = k;
link.next = n;
link = n;
l1 = l1.next;
l2 = l2.next;
}
while(l1==null && l2){ //l2还有高位没加
let n = new ListNode();
k = l2.val;
if(l==1){
k+=1;
l=0;
}
if(k>=10){
l=1;
k-=10;
}
n.val = k;
link.next = n;
link = n;
l2 = l2.next;
}
while(l2==null && l1){ //l1还有高位没加
let n = new ListNode();
k = l1.val;
if(l==1){
k+=1;
l=0;
}
if(k>=10){
l=1;
k-=10;
}
n.val = k;
link.next = n;
link = n;
l1 = l1.next;
}
if(l == 1){ //考虑到最高位还要进1的时候
let n = new ListNode();
n.val = 1;
link.next = n;
link = n;
}
return head.next;
};
3、方法三:简化方法二(性能并没有改善)
var addTwoNumbers = function(l1, l2) {
let k,l=0;
let head = new ListNode();
let p = head;
while(l1 || l2 || l){
let n = new ListNode();
if(l1&&l2)
n.val = l1.val + l2.val;
else if(l1&&l2==null)
n.val = l1.val;
else if(l1==null&&l2)
n.val = l2.val;
else{
n.val = l;
l=0;
}
if(l==1){
n.val ++;
l = 0;
}
if(n.val>=10){
l=1;
n.val -= 10;
}
p.next = n;
p = n;
if(l1) l1 = l1.next;
if(l2) l2 = l2.next;
}
return head.next;
};
4、方法四:继续简化方法三(参考题解)
var addTwoNumbers = function(l1, l2) {
let addOne = 0
let sum = new ListNode('0')
let head = sum
while (addOne || l1 || l2) {
let val1 = l1 !== null ? l1.val : 0
let val2 = l2 !== null ? l2.val : 0
let r1 = val1 + val2 + addOne
addOne = r1 >= 10 ? 1 : 0
sum.next = new ListNode(r1 % 10)
sum = sum.next
if (l1) l1 = l1.next
if (l2) l2 = l2.next
}
return head.next
};
5、方法四:正则匹配法(参考题解)
var addTwoNumbers = function(l1, l2) {
let s1 = JSON.stringify(l1).match(/\d/g).reverse().join(''),
s2 = JSON.stringify(l2).match(/\d/g).reverse().join('')
sum = BigInt(s1)+BigInt(s2)
return [...sum.toString()].reduce((acc,v)=>{return {val: v, next: acc}}, null)
};
总结:写了三个版本的代码,性能不是很好,参考了题解的代码(包括方法四、五)发现也差不多。