LeetCode 2. 两数相加

题目

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

例:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807

方法

根据题目数字是按照逆序存储的,那么首尾即为各位,从左向右进行加法,若存在进位则加在下一个(右边)

  • result 和 curr 分别指向链表的头节点,curr 指向当前节点
  • carry 表示进位,初始为零
  • 循环直至两个链表 l1 和 l2 均为空
    • 若链表 l1 存在,那么将指向该节点的值赋值给 x;否则,赋值零
    • 若链表 l2 存在,那么将指向该节点的值赋值给 y;否则,赋值零
    • sum 表示两个节点加上进位 carry 的和
    • 将该和 sum%10 存入当前节点的下一个节点处,取余数的原因是只能存储一位数,若和为两位数,那么只存储个位
    • 更新进位 carry
    • 为了进行下一步的加法,分别将 l1 和 l2 指向下一个节点
  • 若在完成所有加法后,仍存在进位,那么此时应该将改进为加到下一个节点处
  • 返回新链表
    由于 result 指向的是头节点,而头节点的下一个节点才为链表的第一个节点,所以需要返回 result.next
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        result = curr = ListNode()
        carry = 0
        while l1 or l2:
            if l1:
                x = l1.val
            else:
                x = 0
            if l2:
                y = l2.val
            else:
                y = 0
            sum = x + y + carry
            curr.next = ListNode(sum%10)
            carry = sum // 10
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
            curr = curr.next
        if carry:
            curr.next = ListNode(carry)
        return result.next
参考

代码相关:https://leetcode.cn/problems/add-two-numbers/solution/si-kao-guo-cheng-pythondai-ma-zhu-yi-by-4fl4i/

你可能感兴趣的:(LeetCode 2. 两数相加)