Leetcode 2. 两数相加(python3)

题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
官方思路:
在这里插入图片描述
自己的想法
1.碰到链表与数组的的运算问题,首先一定要设置carry位。
2.可以适当的考虑创建一个空链表,存放要得到的结果,方便return。
代码1:

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        re = ListNode(0)   #设置一个空链表
        r=re               #给空链表命名为r
        carry=0            #进位标识符
        while(l1 or l2):   #遍历l1与l2两个链表 
            x= l1.val if l1 else 0
            y= l2.val if l2 else 0
            s=carry+x+y    #当前位的和
            carry=s//10    #判断标志位是否进位
            r.next=ListNode(s%10)  #将当前位数的和传递给空链表
            r=r.next
            if(l1!=None):l1=l1.next
            if(l2!=None):l2=l2.next
        if(carry>0):  #判断循环最后一次标志位是否进位
            r.next=ListNode(1)
        return re.next 

这里是引用

我们可以看到上面程序在时间和空间复杂度上并不理想,看一下是否有更好的方法。
方法2:
上边的方法额外生成了新的链表用于存放结果,是否有其他方法不用生成新的链表,在原有的链表的基础上进行计算。

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        output = l1  #将输出的链表设置为l1
        carry = 0    #进位标志位
        while l1:
            carry, l1.val = divmod(l1.val + l2.val + carry, 10)  #divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
            previous = l1 #previous相当于求和后的链表存放位置
            l1, l2 = l1.next, l2.next
        
            if (l1 is None) and (l2 is not None):
                l1 = ListNode(0)
                previous.next = l1
            elif (l1 is not None) and (l2 is None):
                l2 = ListNode(0)

        if carry:
            previous.next = ListNode(carry)
        return output 

补充:python内置函数
python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值