Leetcode 编程训练[2]:Add Two Numbers
#2:题目要求是输入两个单链表,按位相加(过十向后加一)。最后输出一个单链表。数据结构已经给出。在JS中一切皆函数,对象也是函数。
function ListNode(val) {
this.val = val;
this.next = null;
}
基本逻辑就是一次检索this.next的val,将两个表的val相加,过十就做一个flag标记,以便在下一链加上这个1。
while(l1 !== null || l2 !== null){
sum = sum / 10;
if(l1 !== null){
sum += l1.val;
l1 = l1.next;
}
if(l2 !== null){
sum += l2.val;
l2 = l2.next;
}
result.next = new ListNode(sum % 10);
result = result.next;
}
这个sum = sum /10就犯了一个JS的致命错误,JS是没有数据类型的,或者说没有严格的数据类型区分。当运算到这一步时,sum可能出现的值是浮点值,而不是需要的整形取余。我们需要parseInt()来取整。
也需要记住,最后跳出循环时,sum值还没有存到单链表结尾。以及返回值是单链表的头,所以我们需要借用一个链表来进行算法运行,而输出结果只是记录头结点。
/**
* 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 resultNode = new ListNode(0);
var result = resultNode;
var sum = 0;
while(l1 !== null || l2 !== null){
sum = parseInt(sum / 10);
if(l1 !== null){
sum += l1.val;
l1 = l1.next;
}
if(l2 !== null){
sum += l2.val;
l2 = l2.next;
}
result.next = new ListNode(sum % 10);
result = result.next;
}
if(sum > 9){
result.next = new ListNode(1);
}
return resultNode.next;
};