LeetCode 刷题小本本Day2 Add Two Numbers(链表)

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。

我的答案:

class Solution:
    def addTwoNumbers(self, l1, l2):
        res_sum = []
        add_ = 0
        flag1 = 1
        flag2 = 1

        while (True):
            l1_val = l1.val
            l2_val = l2.val
            sum = l1_val + l2_val + add_
            add_ = 0
            if (sum < 10):
                res_sum.append(sum)
                if (l1.next==None and l2.next==None):
                    break
            else:
                add_ = int(sum / 10)
                res_sum.append(sum % 10)
                if (flag1==0 and flag2==0):
                    res_sum.append(add_)
                    break

            if (l1.next == None):
                flag1 = 0
                l1.next = ListNode()
            if (l2.next == None):
                flag2 = 0
                l2.next = ListNode()

            l1 = l1.next
            l2 = l2.next

        # 得到了list结果,进行转换
        res = ListNode(res_sum[-1])
        for i in reversed(res_sum[0:-1]):
            res = ListNode(i, res)
        return res

心路历程:

  1. 一开始题目都没看懂o(╥﹏╥)o 看了半天,才明白这相当于从左往右的加法。
  2. 然后打开pycharm,构建满足题目要求的ListNode l 1 l1 l1 l 2 l2 l2,这一步也搞了半天。
  3. 一开始的思路是,从左往右一个一个加嘛,然后用add_存溢出的数。但是题目要求返回的值也要是链表,这就难倒我了。
  4. 链表实在是太讨厌了,不能用sum = 0 sum = sum+i这种操作,因为它有value和next两个属性,这样赋值的话,会造成 cycle 的问题。想了半天没想出来怎么解决,最后决定用list存储结果,最后再转成链表。
  5. 然后又发现问题,就是不知道循环多少次,因为链表既没有sizeof()又没有len(),只能通过next属性。两个链表长度还不一样,于是弄了一个flag记录是不是到了最后一个节点,当flag都等于0时就停下来。
  6. 加到最后还有进位时,也很麻烦。我的解决办法是,判断sum>10时,再判断一下是不是到了结尾。不过这样做蠢蠢的。
  7. 提交的时候又发现了新问题o(╥﹏╥)o 当输入为[0][0]时出问题。因为我在代码中用到了l1=l1.next() l1.next相当于寻找了两次next。啊啊啊,脑壳痛。于是交换了位置,不过还是有问题。
  8. 做了三个半小时,终于做出来了~

第二天看了看参考答案,发现参考答案的思路跟我是一样的,也是从左往右加,记录下进位carry,并且整体流程也差不多(^ ^)。
不过除了循环的方式,我还看见了递归的解法,C++实现的

参考答案1:

def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
    dummy = curr = ListNode()
    carry = 0
    while l1 or l2:
        x = l1.val if l1 else 0
        y = l2.val if l2 else 0

        total = x + y + carry
        curr.next = ListNode(total % 10)
      
        curr = curr.next
        carry = total // 10

        if l1: l1 = l1.next
        if l2: l2 = l2.next
    if carry: curr.next = ListNode(carry)
    return dummy.next
  • 一开始取值的时候,就判断了l1和l2的状态。
  • 移动的时候也要先检查l1是不是none,再移动。
  • 每次sum都要计算一次carry,最后也要检查carry状态。

参考答案 2:

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = curr = ListNode()
        carry = val = 0

        while carry or l1 or l2:
            val = carry

            if l1: l1, val = l1.next, l1.val + val
            if l2: l2, val = l2.next, l2.val + val

            carry, val = divmod(val, 10)
            curr.next = curr = ListNode(val)
        
        return head.next
  • 一开始就检查l1,l2,carry状态。
  • 哎呀,这个参考答案太高级了,学不会学不会

新知识:

  1. //表示整数除法。15//10=1
  2. divmod() 函数返回当参数 1 除以参数 2 时包含商和余数的元组
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值