LeetCode之两数相加——JavaScript实现

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

看到这道题的时候有点无从下手,因为不知道js的链表表现形式是怎么样的
看到一篇博文JavaScript 版数据结构与算法(三)链表才稍微理解

题中的2->4->3可以理解为

{
  element: 2,
  next: {
    element: 4,
    next: {
      element: 3,
      next: null
    }
  }
}

那这样就好办了

解题思路:

  • 取出每次遍历的链表值相加
  • 如果进位则统计起来
  • 题中l1,l2长度不确定,所以当l1,l2以及进位不为空时,继续计算
  • 用一个新的对象存要返回的链表

需要的知识点:

  • 如何在javascript里遍历链表

JavaScript代码

/**
 * 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 mylist1 = l1;
    var mylist2 = l2;
    var c3;
    var l3;
    var carry = 0;
    while(mylist1 || mylist2|| carry){
        var value1 = 0;
        var value2 = 0;
        var sum = 0;
        if(mylist1)
        {
            value1 = mylist1.val;
            mylist1 = mylist1.next;            
        }
        if(mylist2)
        {
            value2 = mylist2.val;
            mylist2 = mylist2.next;
        }
        sum = value1 + value2 + carry;
        carry = Math.floor(sum / 10);
        if (!c3) {
            l3 = new ListNode(sum % 10);
            c3 = l3;
        } else {
          c3.next = new ListNode(sum % 10);
          c3 = c3.next;
        }
    }
    return l3;
};

踩坑:之前没有用c3代替l3向下遍历,导致最后输出的结果是最后一个对象

参考博客:JavaScript 版链表算法题:两个数相加

你可能感兴趣的:(LeetCode之两数相加——JavaScript实现)