1 题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2 思路
这道题看似简单,但实际上要考虑边界条件,如果链表很长,则不能直接转化为数字相加(整数范围溢出),因此就得考虑自己进行对位相加,然后进位+1
3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
var arr1 = [];
var arr2 = [];
do {
arr1.unshift(l1.val);
l1 = l1.next;
}while(l1 != null);
do {
arr2.unshift(l2.val);
l2 = l2.next;
}while(l2 != null);
var result = [];
var nextAddOne = 0;
var sum;
while(arr1.length > 0 || arr2.length > 0) {
var num1 = arr1.pop() || 0;
var num2 = arr2.pop() || 0;
sum = num1 + num2 + nextAddOne;
if (sum >= 10) { //进位
nextAddOne = 1;
sum -= 10;
} else { //不进位
nextAddOne = 0;
}
result.push(sum);
}
if (nextAddOne > 0) result.push(1); //注意最后也要进位
function ListNode(val) {
this.val = val;
this.next = null;
}
var list;
var returnList;
result.forEach(function(i) {
if (!list) {
list = new ListNode(i);
returnList = list;
} else {
list.next = new ListNode(i);
list = list.next;
}
});
return returnList;
};