一起来刷leetcode(2)——两数相加

345 阅读2分钟

只要你的心是善良的

对错都是别人的事

前言

一天,在一辆公共汽车上有很多人,正在售票员卖票时,突然一个人放了一个屁,车上的人都感到呼吸不适,纷纷骂着这个不文明的人。
这时售票员大声喊:“谁没买票?”
一名乘客答:“刚放屁的那个人没买票”
这时一个人站起来大声嚷:“谁说我没买票”

小样,你还嘴硬
千呼万唤始出来,不抱琵琶还遮面
出来混,迟早是要还的 (/ω\)

1 思路分析

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]

leetcode.png

1.1 基本步骤

  1. 循环链表
  2. 不足补0
  3. 依次相加,补上进位
  4. 余数存表,满十进1
  5. 链表递增
  6. 结尾进1补1
  7. 返回链表

1.2 重点步骤

不足补0

2.1. 没有l,l.val为0

依次相加,补上进位

3.1. sum = l1.val + l2.val + addOne

2 代码片段

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  let addOne = 0
  let curr = new ListNode(0)
  let head = curr

  while (l1 || l2) {
    // 不足补0
    !l1 && (l1 = new ListNode(0))
    !l2 && (l2 = new ListNode(0))
    
    // 相加补位
    const sum = l1.val + l2.val + addOne
    curr.next = new ListNode(sum % 10)
    addOne = Math.floor(sum / 10)

    // 依次递增
    l1 = l1.next
    l2 = l2.next
    curr = curr.next
  }

  // 结尾补1
  addOne && (curr.next = new ListNode(1))

  return head.next
}

3 技巧总结

1.ListNode

// a = []
l = new ListNode()

// a[0]
l.val

// a[1] = 1
l.next = new ListNode(1)

// a[i++]
l = l.next()

// a.forEach
while(l) {
  do something
}

2.while循环

// 长度不一致
const a1 = [1,2,3]
const a2 = [1,2]
while(a1.length || a1.length) {
  // 全部遍历
}

4 学以致用

对比版本号

/**
 * @param {V1} 1.17.2356
 * @param {V2} 1.18
 * @return {Boolean}
 */
var compareVersion = function(V1, V2) {
  if (V1 === V2) return false

  const a1 = V1.split('.')
  const a2 = V2.split('.')

  // 循环补0
  while (a1.length || a2.length) {
    !a1[0] && (a1[0] = 0)
    !a2[0] && (a2[0] = 0)

    if (a1[0] === a2[0]) {
      a1.shift()
      a2.shift()
    } else if (a1[0] - a2[0] > 0) {
      return true
    } else {
      return false
    }
  }
}

万物皆有裂痕


那是光之来处 O(∩_∩)O

参考链接

往期回顾