给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:
两数相加 - 图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
  • 题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

栈解法

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. * val: number
  5. * next: ListNode | null
  6. * constructor(val?: number, next?: ListNode | null) {
  7. * this.val = (val===undefined ? 0 : val)
  8. * this.next = (next===undefined ? null : next)
  9. * }
  10. * }
  11. */
  12. function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
  13. const s1 = [], s2 = [];
  14. let carry = 0, head = null, curr = null;
  15. while(l1 !== null) {
  16. s1.push(l1.val);
  17. l1 = l1.next;
  18. }
  19. while(l2 !== null) {
  20. s2.push(l2.val);
  21. l2 = l2.next;
  22. }
  23. while(s1.length !== 0 || s2.length !== 0) {
  24. let sum = carry;
  25. if (s1.length !== 0) {
  26. sum += s1.shift();
  27. }
  28. if (s2.length !== 0) {
  29. sum += s2.shift();
  30. }
  31. const node = new ListNode(sum % 10);
  32. carry = Math.floor(sum / 10);
  33. if (curr === null) {
  34. curr = node;
  35. head = curr;
  36. } else {
  37. curr.next = node;
  38. curr = curr.next;
  39. }
  40. }
  41. if (carry !== 0) {
  42. const node = new ListNode(carry);
  43. if (curr === null) {
  44. curr = node;
  45. head = curr;
  46. } else {
  47. curr.next = node;
  48. curr = curr.next;
  49. }
  50. }
  51. return head;
  52. };