2. 两数相加 js

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

解法一:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
 let res = new ListNode() //用于存放结果的链表
 let sym = false  //进位的标志符
 let head = true  //判断是不是头节点
 let pointer = res  //指向插入位置的指针
 while(l1 || l2 || sym){ //只要一个链表还没结束或者还有进位没有处理都会进入循环
     if(head){ //处理头节点
         if(l1.val + l2.val >= 10){
             res.val =  l1.val + l2.val - 10 
             sym = true
         }else{
             res.val =  l1.val + l2.val 
             sym = false;
         }
         head = false
     }else{  //处理非头节点的节点
         l2 = l2 === null ? new ListNode(0) : l2 
         //如果链表已经到头了,但是另一个链表还没到头,或者是两个链表都到头了,但是还有进位没算,都要手动创建一个值为0的节点
         l1 = l1 === null ? new ListNode(0) : l1
         sum = sym ? l1.val + l2.val + 1 : l1.val + l2.val //根据进位符算出和
          if(sum >= 10){
             let arr = new ListNode() //创建一个新的节点
             arr.val = sum - 10       //给节点赋值
             pointer.next = arr       //让当前节点的next指向新节点
             pointer = pointer.next    //移动当前节点的指针到下一个节点
             sym = true
         }else{
             let arr = new ListNode()
             arr.val = sum
             pointer.next = arr
             pointer = pointer.next
             sym = false;
         }
     }
         l1 = l1.next; //移动到链表的下一个节点
         l2 = l2.next;
     }

  return res;
 }

执行用时: 76 ms
内存消耗: 46 MB

主要思路:头节点是直接赋值的,后面的节点需要一个指针帮助定位,指针指向当前节点所在的位置,每次加起来的和存在当前节点,同时创建一个新的节点,让当前节点的next指向新创建的节点,最后移动pointer指针指向下一个节点。
注意:因为当next的值是undefined的时候,会赋值null,因此没有必要再手动给一个null的值了,这样反而不对。

中间有一段代码可以进行缩写,看起来更加简洁美观
if(sum >= 10){
             let arr = new ListNode() //创建一个新的节点
             arr.val = sum - 10       //给节点赋值
             pointer.next = arr       //让当前节点的next指向新节点
             pointer = pointer.next    //移动当前节点的指针到下一个节点
             sym = true
         }else{
             let arr = new ListNode()
             arr.val = sum
             pointer.next = arr
             pointer = pointer.next
             sym = false;
         }
可以改成:
         let arr = new ListNode()
         arr.val = sum >= 10 ? sum - 10 : sum
         pointer.next = arr
         pointer = pointer.next
         sym = sum >= 10 ? true : false
但是会加长运行的时间,所以看情况缩写

执行用时: 88 ms
内存消耗: 46 MB

缩写之后的完整代码:


var addTwoNumbers = function(l1, l2) {
 let res = new ListNode()
 let sym = false;
 let head = true
 let pointer = res
 while(l1 || l2 || sym){
     if(head){
         if(l1.val + l2.val >= 10){
             res.val =  l1.val + l2.val - 10 
             sym = true
         }else{
             res.val =  l1.val + l2.val 
             sym = false;
         }
         head = false
     }else{
         l2 = l2 === null ? new ListNode(0) : l2
         l1 = l1 === null ? new ListNode(0) : l1
         sum = sym ? l1.val + l2.val + 1 : l1.val + l2.val
         let arr = new ListNode()
         arr.val = sum >= 10 ? sum - 10 : sum
         pointer.next = arr
         pointer = pointer.next
         sym = sum >= 10 ? true : false
       
     }
         l1 = l1.next;
         l2 = l2.next;
     }

  return res;
 }

你可能感兴趣的:(leetcode,javascript,链表,leetcode)