力扣的两数相加解法 (Python)

力扣的两数相加解法

题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

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

参考程序1:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
        # 如果有一个链表为空,返回另外一个
        if line1 is None:
            return line2
        if line2 is None:
            return line1
        # temp是暂时存(temporal)
        temp = ListNode(0)  # 引用ListNode类定义了一个链表节点并赋给tmp
        # reset是重置(reset)
        reset = temp  # 进行赋值
        # flag 标示
        flag = 0  # 初始化
        while line1 or line2:  # line1或line2不为空就继续执行
            temp_sum = 0  # 链表节点值的和
            if line1:  # 如果line1不为空,把line1的某个节点值的和赋给temp_sum
                temp_sum = line1.val  # 把line1的某个节点的值赋给temp_sum
                line1 = line1.next
            if line2:  # 如果line2不为空,把line2中和line1对应的节点的值加到tmp_sum
                temp_sum += line2.val
                line2 = line2.next  # 指向下一个节点,为下一次的加和做准备
            temp_res = ((temp_sum + flag) % 10)  # 个位数字
            flag = ((temp_sum + flag) // 10)  # 进位的数
            reset.next = ListNode(temp_res)
            reset = reset.next  # reset后移
            if flag:  # 如果flag不为0,就是对应位置相加后有进位
                reset.next = ListNode(1)  # reset的下一节点设为1
        reset = temp.next  # 赋值
        del temp  # 删除temp变量
        return reset  # 返回reset链表

运行结果1:
在这里插入图片描述
参考程序2:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
        carry = 0
        head = ListNode(0)
        reset = head
        while line1 or line2:
             num1 = line1.val if line1 else 0
             num2 = line2.val if line2 else 0
             temp = num1 + num2 + carry
             carry = 1 if temp >= 10 else 0
             head.next = ListNode(temp % 10)
             head = head.next
             if line1: 
                 line1 = line1.next
             if line2: 
                 line2 = line2.next
             if carry:
                 head.next = ListNode(1)
        return reset.next

运行结果2:
在这里插入图片描述
参考程序3:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def addTwoNumbers(self, line1: ListNode, line2: ListNode) -> ListNode:
        carry = 0
        temp = 0
        line3 = ListNode(0)
        reset = line3
        while line1 is not None or line2 is not None or carry > 0:
            temp = carry
            if line1 is not None:
                temp += line1.val
                line1 = line1.next
            if line2 is not None:
                temp += line2.val
                line2 = line2.next
            node = ListNode(temp % 10)
            line3.next = node
            line3 = line3.next
            carry = temp // 10
        return reset.next

运行结果3:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值