day21: 2. 两数相加(中等)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路:
一个比较巧妙的地方:一位内数字是按照逆序的顺序存储的,因此将其反转过来之后,相加,但是位数不一致的时候就需要错位,此时,相加的位置正好和逆序排序的顺序相同。
例如:
[2,4,9][5,6,4,9]
将其反转过来之后:[9,4,2][9,4,6,5]相加时,前面需要往前补一位0。
var addTwoNumbers = function (l1, l2) {
let result = new ListNode(0);
let rhead = result,
tail = null;
let add = 0;
while (l1 || l2) {
let sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + add;
if (!rhead) {
rhead = new ListNode(sum % 10);
} else {
rhead.next = new ListNode(sum % 10);
rhead = rhead.next;
}
add = Math.floor(sum / 10);
//l2的长度较短
if (l1) {
l1 = l1.next;
}
//l1的长度较短
if (l2) {
l2 = l2.next;
}
//商大于0,继续进位
if (add > 0) {
rhead.next = new ListNode(add);
}
}
return result.next;
};
网友评论