image.png

    1. // 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
    2. // 请你将两个数相加,并以相同形式返回一个表示和的链表。
    3. // 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    4. // 输入:l1 = [2,4,3], l2 = [5,6,4]
    5. // 输出:[7,0,8]
    6. // 解释:342 + 465 = 807.
    7. // 示例 2:
    8. // 输入:l1 = [0], l2 = [0]
    9. // 输出:[0]
    10. // 示例 3:
    11. // 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    12. // 输出:[8,9,9,9,0,0,0,1]
    13. /**
    14. * Definition for singly-linked list.
    15. * function ListNode(val, next) {
    16. * this.val = (val===undefined ? 0 : val)
    17. * this.next = (next===undefined ? null : next)
    18. * }
    19. */
    20. /**
    21. * @param {ListNode} l1
    22. * @param {ListNode} l2
    23. * @return {ListNode}
    24. */
    25. // 题解
    26. // 1.从数学角度上来看很简单,就是小学加法,不同的是要逆序返回
    27. // 2。满十位数进一
    28. // 3.可以将两个链表循环相加,存入新链表中返回
    29. var addTwoNumbers = function(l1, l2) {
    30. // 定义新链表返回
    31. let l3 = new ListNode(0);
    32. let p1 = l1;
    33. let p2 = l2;
    34. let p3 = l3;
    35. // 定义一个变量用来保存满十进一
    36. let carry = 0
    37. // 循环两个链表
    38. while(p1 || p2) {
    39. // 获取p1,p2的val,因为p1,p2长度可能不同,所以要进行判断
    40. let v1 = p1 ? p1.val : 0;
    41. let v2 = p2 ? p2.val : 0;
    42. // val的值为v1 + v2, 加上十位数上的值
    43. let val = v1 + v2 + carry;
    44. // 我们再给十位数赋值
    45. carry = Math.floor(val / 10);
    46. // p3 创建新节点保存个位数上的值
    47. p3.next = new ListNode(val % 10);
    48. // 都往后走一步,因为p1, p2 长度不一定存在,所以要加判断
    49. if(p1) {p1 = p1.next}
    50. if(p2) {p2 = p2.next}
    51. p3 = p3.next
    52. }
    53. if(carry) { p3.next = new ListNode(carry)}
    54. return l3.next;
    55. };