解题日期:20.08.23 链表

题目

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

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers

  • 这个解蛮菜的,只战胜了18%的人哈哈哈,但是第一次挑战中等题,写下解题思路
  • 一开始我不明白链表在这道题中指的是什么,概念知道了是存储指向下一个的地址,但是不知道在js中怎么表示,其实就相当于对象嵌套↓

    1. ListNode {
    2. val: 1,
    3. next: ListNode {
    4. val: 2,
    5. next: {
    6. val: 3,
    7. next: null
    8. }
    9. }
    10. }
  • 搞明白这个概念后思考这个题,说起来很简单,就是每一位相加,如果大于10就进位。

  • 实际操作相当于递归,每次处理的是 next 的对象,这个很妙的写法是从评论区看来的,利用一个 temp 作为中间媒介,每次拿result.next的引用,做到了循环时给嵌套赋值。
    1. /**
    2. * Definition for singly-linked list.
    3. * function ListNode(val) {
    4. * this.val = val;
    5. * this.next = null;
    6. * }
    7. */
    8. /**
    9. * @param {ListNode} l1
    10. * @param {ListNode} l2
    11. * @return {ListNode}
    12. */
    13. var addTwoNumbers = function(l1, l2) {
    14. let result = new ListNode(null)
    15. // 一定拷贝的是引用
    16. let temp = result
    17. let tenLoc = 0
    18. while (l1 || l2 || tenLoc) {
    19. if (l1) {
    20. l1.val = l1.val ? l1.val : 0
    21. } else {
    22. l1 = {
    23. val: 0,
    24. next: null
    25. }
    26. }
    27. if (l2) {
    28. l2.val = l2.val ? l2.val : 0
    29. } else {
    30. l2 = {
    31. val: 0,
    32. next: null
    33. }
    34. }
    35. temp.val = tenLoc + l1.val + l2.val
    36. tenLoc = parseInt(temp.val / 10)
    37. temp.val = temp.val % 10
    38. l1 = l1.next
    39. l2 = l2.next
    40. if (l1 || l2 || tenLoc) {
    41. temp.next = {}
    42. } else {
    43. temp.next = null
    44. }
    45. temp = temp.next
    46. }
    47. return result
    48. };

错误思路存档

  • 将链表转成数组,然后将数组倒转->join(),变成数字,对数字进行加减,最后转回链表
  • 问题:js在超大整数计算时会出现精度丢失的问题,即 100000000000000000000+645 的输出结果是 100000000000000000000
    1. /**
    2. * Definition for singly-linked list.
    3. * function ListNode(val) {
    4. * this.val = val;
    5. * this.next = null;
    6. * }
    7. */
    8. /**
    9. * @param {ListNode} l1
    10. * @param {ListNode} l2
    11. * @return {ListNode}
    12. */
    13. var addTwoNumbers = function(l1, l2) {
    14. function listNode2Array(l) {
    15. let array = []
    16. return function () {
    17. array.push(l.val)
    18. if (l.next) {
    19. array = array.concat(listNode2Array(l.next)())
    20. }
    21. return array
    22. }
    23. }
    24. function array2ListNode(arr) {
    25. var result = {val: arr[0], next: {}}
    26. arr.reduce(function (pre, current, currentIndex) {
    27. pre.val = current
    28. console.log(pre)
    29. if(currentIndex === arr.length - 1) {
    30. pre.next = null
    31. } else {
    32. pre.next = {}
    33. return pre.next
    34. }
    35. }, result)
    36. console.log(result)
    37. return result
    38. }
    39. let addSum = parseInt(listNode2Array(l1)().reverse().join('')) + parseInt(listNode2Array(l2)().reverse().join('')) console.log(addSum)
    40. let tempStr = ''
    41. if (addSum.toString().match(/[^0-9]/)) {
    42. tempStr = addSum.toLocaleString().replace(/,/g, '')
    43. } else {
    44. tempStr = addSum.toString()
    45. }
    46. return array2ListNode(tempStr.split('').reverse().map(item => +item))
    47. };