题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解答一
一步步加法进位取余除法,耗时172ms
var addTwoNumbers = function(l1, l2) {
let carry = 0;
let dummyhead = new ListNode();
let current = dummyhead;
let p1 = l1, p2= l2;
while(p1||p2||carry){
carry += ((p1&&p1.val)||0) + ((p2&&p2.val)||0)
let node = new ListNode(carry%10);
current.next = node;
carry = parseInt(carry/10);
p1 && (p1 = p1.next)
p2 && (p2 = p2.next)
current = current.next
}
return dummyhead.next
};
解答二(划掉)
不取余,不做除法,判断一下carry和10相对大小,进位取1或者0,耗时124ms
var addTwoNumbers = function(l1, l2) {
let carry = 0;
let dummyhead = new ListNode();
let current = dummyhead;
let p1 = l1, p2= l2;
while(p1||p2||carry){
carry += ((p1&&p1.val)||0) + ((p2&&p2.val)||0)
let node = new ListNode(carry<10?carry:(carry-10));
current.next = node;
carry = (carry>=10)?1:0;
p1 && (p1 = p1.next)
p2 && (p2 = p2.next)
current = current.next
}
return dummyhead.next
};