Leetcode前端必会系列:两数和

98 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例 1:

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.

示例 2:

输入: l1 = [0], l2 = [0]
输出: [0]

示例 3:

输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出: [8,9,9,9,0,0,0,1]

 

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9

分析

根据题目的分析,我们如何求两数和?根据题目的要求我们可以总结出下面的步骤设计。

  1. 两个数倒序的相加,判断是否超过10,超过了进位
  2. 持续的累加,判断,不断的判断
  3. 最后返回结果。

解答

/**
 * 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 res1 = []
  let res2 = []
  let res = []
  let jin = 0
  let i,j
  let p,q 
  p = l1,q = l2
  while(p) {
    res1.unshift(p)
    p = p.next
  }
  while(q) {
    res2.unshift(q)
    q = q.next
  }
  i = res1.length-1,j = res2.length-1
  while(i>=0 && j>=0) {
    let sum = res1[i].val+res2[j].val+jin
    if(sum>=10) {
      res.unshift(sum-10)
      jin = 1
    } else {
      res.unshift(sum)
      jin = 0
    }
    i--
    j--
  }
  while(i>=0) {
    let sum = res1[i].val+jin
    if(sum>=10) {
      res.unshift(sum-10)
      jin = 1
    } else {
      res.unshift(sum)
      jin = 0
    }
    i--
  }
  while(j>=0) {
    let sum = res2[j].val+jin
    if(sum>=10) {
      res.unshift(sum-10)
      jin = 1
    } else {
      res.unshift(sum)
      jin = 0
    }
    j--
  }
  if(jin===1) res.unshift(1)
  
  //遍历res进行合并
  head = new ListNode()
  p = head
  for(let i=res.length-1;i>=0;i--) {
      let node = new ListNode(res[i])
      p.next = node
      p =  node
  } 
  p.next = null
  return head.next
};

根据代码,我们发现两数和还是比较容易地,按照设计就可以一步步完成题目的解答了。

总结

两数和讲完了,我们下一节继续啊。