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;
};

outcome


代码