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

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

    输出:7 -> 0 -> 8

    原因:342 + 465 = 807

    链接:https://leetcode-cn.com/problems/add-two-numbers

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

    我的解法:

    1. /**
    2. * 构造链表数据结构
    3. */
    4. function ListNode (val) {
    5. this.val = val
    6. this.next = null
    7. }
    8. /*
    9. * 获取链表长度
    10. * @param {ListNode} listNode类型数据
    11. */
    12. function getLength (ListNode) {
    13. let len = 0
    14. let temp = ListNode
    15. while(temp) {
    16. len++
    17. temp = temp.next
    18. }
    19. return len
    20. }
    21. /*
    22. * listNode转化为数组
    23. * @param {ListNode}
    24. * @return Array
    25. */
    26. function listNodeToArr (ListNode) {
    27. const arr = []
    28. let next = ListNode
    29. while (next) {
    30. arr.push(next.val)
    31. next = next.next
    32. }
    33. return arr
    34. }
    35. /*
    36. * 递归调用产生listNode 格式
    37. * @param Array|Number
    38. * @return {ListNode}
    39. */
    40. function generatelistNode (arr) {
    41. if(!arr.length) return null
    42. let node = new ListNode(arr.shift())
    43. node.next = generatelistNode(arr)
    44. return node
    45. }
    46. function addTwoNumbers (l1, l2) {
    47. if (!l1 || !l2) return l1 ? l2 : l1
    48. // 获取里两个链表对应长度,对短链表末位补零
    49. const len1 = getLength(l1)
    50. const len2 = getLength(l2)
    51. let l1Arr, l2Arr
    52. if (len1 !== len2) {
    53. // 需要补的位数
    54. let degits = Math.abs(len1 - len2)
    55. // 构造出需要补位的数据
    56. // ListNode 转数组,再转会listNode
    57. l1Arr = len1 > len2 ? listNodeToArr(l1) : listNodeToArr(l1).concat(Array(degits).fill(0))
    58. l2Arr = len1 > len2 ? listNodeToArr(l2).concat(Array(degits).fill(0)) : listNodeToArr(l2)
    59. } else {
    60. l1Arr = listNodeToArr(l1)
    61. l2Arr = listNodeToArr(l2)
    62. }
    63. console.log('l1Arr, l2Arr ---', l1Arr, l2Arr)
    64. // 拿到连个等长的数组,开始逐一相加,产生进位,向后加一 (因为是逆序)
    65. const result = []
    66. let carry = 0
    67. let l1ArrFirst = l1Arr.shift() // 每次取数组第一位
    68. let l2ArrFirst = l2Arr.shift()
    69. while (l1ArrFirst !== undefined || l2ArrFirst !== undefined || carry) {
    70. const sum = (l1ArrFirst || 0) + (l2ArrFirst || 0) + carry
    71. if (sum >= 10) {
    72. carry = 1
    73. result.push(sum % 10)
    74. } else {
    75. carry = 0
    76. result.push(sum)
    77. }
    78. l1ArrFirst = l1Arr.length ? l1Arr.shift() : undefined// 每次取数组第一位
    79. l2ArrFirst = l2Arr.length ? l2Arr.shift() : undefined
    80. }
    81. // 拿到倒序的数组,构造成listNode链表格式
    82. // console.log('result ---', result, Array.isArray(result))
    83. const final = generatelistNode(result)
    84. // console.log('最终链表是:', final)
    85. return final
    86. }
    87. // 构造数据
    88. const l1 = new ListNode(2)
    89. const l1x = new ListNode(4)
    90. const l1y = new ListNode(3)
    91. const l1z = new ListNode(5)
    92. l1.next = l1x
    93. l1x.next = l1y
    94. l1y.next = l1z
    95. const l2 = new ListNode(5)
    96. const l2x = new ListNode(6)
    97. const l2y = new ListNode(4)
    98. l2.next = l2x
    99. l2x.next = l2y
    100. addTwoNumbers(l1, l2)

    去掉链表补齐的操作后
    image.png

    优秀答案:

    1. /**
    2. * Definition for singly-linked list.
    3. * function ListNode(val, next) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.next = (next===undefined ? null : next)
    6. * }
    7. */
    8. /**
    9. * @param {ListNode} l1
    10. * @param {ListNode} l2
    11. * @return {ListNode}
    12. */
    13. var addTwoNumbers = function(l1, l2) {
    14. let addOne = 0
    15. let sum = new ListNode('0')
    16. let head = sum
    17. while (addOne || l1 || l2) {
    18. let val1 = l1 !== null ? l1.val : 0
    19. let val2 = l2 !== null ? l2.val : 0
    20. let r1 = val1 + val2 + addOne
    21. addOne = r1 >= 10 ? 1 : 0
    22. sum.next = new ListNode(r1 % 10)
    23. sum = sum.next
    24. if (l1) l1 = l1.next
    25. if (l2) l2 = l2.next
    26. }
    27. return head.next
    28. };
    29. 作者:afeng-xiu
    30. 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-ge-shu-xiang-jia-zui-rong-yi-li-jie-de-jie-f/