力扣(leetcode) 2. 两数相加 (保姆级教学)------击败了 100% Python3的提交记录

题目在这:https://leetcode-cn.com/problems/add-two-numbers/

题目分析:

题目应该是比较好理解的,就是竖着对应相加就行了。
在这里插入图片描述

唯一注意的地方,平常做加法的进位是往左边。本题是依次往右边。

思路分析:

有几种方法 先说一下。
1.直接法~ :直接相加,相加的过程中考虑进位问题
2.补齐法~:先把两个列表补齐到同样长度。然后再相加,过程中考虑进位问题。
3.花里胡哨法: 将链表全变成普通列表。列表相加。然后考虑进位。再变回链表返回。

这里采用一个超容易理解的方法: 先相加。最后考虑进位问题。
而且会了这个方法。其他方法也就会了。

对于学过数据结构课本,但没有在leetcode上写过题的小伙伴:

# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
L3 = ListNode()

表示建立了只有一个节点的链表 L3。

大致思路就是 将L1和L2相加 ,存到L3里。最后考虑L3的进位问题。

各种情况分析:

一.

当L1和L2都指向最后的时候:
在这里插入图片描述
即:

L1 == None and L2 == None

这时候显然遍历结束。

二.

当L1没结束且L2没结束的时候。
显然要计算L1 + L2的值,放到L3里

l3.val = l1.val + l2.val

然后将L1和L2的指针往后挪。

l1 = l1.next
l2 = l2.next

L3继续开辟新的节点,然后把L3指针往后挪。

l3.next = ListNode()
l3 = l3.next

这里有一个需要注意的点,如果说L1和L2往后挪了之后都指向了None,那么也就是不需要再相加了,也就不需要再开辟L3的新节点了。

if l1 == None and l2 == None:
    continue
else:
    l3.next = ListNode()
    l3 = l3.next

三.

L1已经结束但L2没有结束的时候。
显然只需要吧L2的值给L3。

然后L2指针往后挪。

看看挪动之后的L2是不是已经指向None了,如果已经指向None则不需要在开辟新的L3节点了

elif l1 == None and l2 != None:
     l3.val = l2.val
     l2 = l2.next
     if l2 != None:
         l3.next = ListNode()
         l3 = l3.next

四.

L1没有结束但L2已经结束的时候。

同理第三种情况。把L1剩下的给L3就行了。

重复上面的四种情况。直到L1和L2都遍历完了指向了None。

这时候得到一个全新的链表L3,但还没考虑进位的情况。
我们从头开始遍历L3 ,如果当前L3所指向的值是大于9的,就让他进位。

采用 divmod(a,b) 该函数计算a除b 返回 商和余数

temp,p.val = divmod(p.val,10) # 商给temp,用于进位 。余数给了p所指向的值

这里也要考虑一个点。例如我们得到了还没有进位的链表 [3,2,5,10]
这里的最后一位数10需要进位,所以在程序中需要判断当前是不是最后一位,如果是最后一位,则需要L3开辟新的节点。

其他的点解释都在注释里了。

进位的代码:

if l1 == None and l2 == None: # 此时已得到没考虑进位的列表L3
    while True:
        if p.val > 9: # 大于9则进位
            if p.next == None: # 看当前是否已经是最后一位
                p.next = ListNode() # 开辟新的L3节点
            temp,p.val = divmod(p.val,10) # 取商和余数 余数给当前
            p.next.val += temp  # 将商加到下一位
            temp = 0 # 每次运算完成都重置商为0
        p = p.next
        if p == None:
            return l # 遍历完成,返回

完整代码:

l3 = ListNode()
p= l3   # p指针用于第二次遍历解决进位问题
l = p   # l指针用于返回答案
while True:
    if l1 == None and l2 == None: # 此时已得到没考虑进位的列表L3
        while True:
            if p.val > 9:
                if p.next == None: # 看当前是否已经是最后一位
                    p.next = ListNode() # 开辟新的L3节点
                temp,p.val = divmod(p.val,10) #
                p.next.val += temp  # 将商加到下一位
                temp = 0 # 每次运算完成都重置商为0
            p = p.next
            if p == None:
                return l # 遍历完成,返回
    elif l1 != None and l2 != None: 
        l3.val = l1.val + l2.val
        l1 = l1.next
        l2 = l2.next
        if l1 == None and l2 == None:
            continue
        else:
            l3.next = ListNode()
            l3 = l3.next

    elif l1 == None and l2 != None:
        l3.val = l2.val
        l2 = l2.next
        if l2 != None:
            l3.next = ListNode()
            l3 = l3.next
    elif l1 != None and l2 == None:
        l3.val = l1.val
        l1 = l1.next
        if l1 != None:
            l3.next = ListNode()
            l3 = l3.next


提交击败了100%的python3用户

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值