题目

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

示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路

逐步相加,赋值到一个新的链表即可。

动态图

算法 002 两数相加 - 图1

代码

  1. # 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
  2. #
  3. # 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
  4. #
  5. # 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
  6. #
  7. # 示例:
  8. #
  9. # 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
  10. # 输出:7 -> 0 -> 8
  11. # 原因:342 + 465 = 807
  12. #
  13. # Related Topics 链表 数学
  14. # 👍 4677 👎 0
  15. # leetcode submit region begin(Prohibit modification and deletion)
  16. # Definition for singly-linked list.
  17. # class ListNode(object):
  18. # def __init__(self, x):
  19. # self.val = x
  20. # self.next = None
  21. class Solution(object):
  22. def addTwoNumbers(self, l1, l2):
  23. """
  24. :type l1: ListNode
  25. :type l2: ListNode
  26. :rtype: ListNode
  27. """
  28. # 进位
  29. carry = 0
  30. first = True
  31. headNode = None
  32. currentNode = None
  33. while l1 or l2 or carry != 0:
  34. var1 = 0
  35. var2 = 0
  36. if l1:
  37. var1 = l1.val
  38. l1 = l1.next
  39. if l2:
  40. var2 = l2.val
  41. l2 = l2.next
  42. sum = var1 + var2 + carry
  43. if sum > 9:
  44. carry = 1
  45. sum %= 10
  46. else:
  47. carry = 0
  48. node = ListNode(sum)
  49. if first:
  50. headNode = node
  51. currentNode = node
  52. first = False
  53. else:
  54. currentNode.next = node
  55. currentNode = currentNode.next
  56. return headNode
  57. # leetcode submit region end(Prohibit modification and deletion)
  58. if __name__ == '__main__':
  59. l1 = ListNode(1)
  60. l1.next = ListNode(2)
  61. l2 = ListNode(2)
  62. l2.next = ListNode(3)
  63. l3 = Solution().addTwoNumbers(l2, l1)
  64. print(l3)