栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 刷题小本本Day2 Add Two Numbers

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 时包含商和余数的元组
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号