两数相加Ⅰ和Ⅱ

一、第2题

1.题目介绍

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

2.思路介绍

总体上四个步骤,1.遍历l1和l2相同长度的部分,将两者相加的值插入目标列表。2.遍历l1剩余部分,将值插入目标列表,若有的话。3.遍历l2剩余部分,将值插入目标列表,若有的话。4.若最后一位大于十,则需进位。细节上用mark来标记进位。

3.代码展示

def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1 and not l2: return None
        move1 = l1
        move2 = l2
        dummy = ListNode(0)
        move = dummy
        mark = 0
        while l1 and l2:
            t = l1.val + l2.val + mark
            if t >= 10:
                n = t%10 
                mark = 1
            else:
                n = t%10 
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
            l2 = l2.next
        while l1:
            t = l1.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
        while l2:
            t = l2.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l2 = l2.next
        if mark == 1:
            move.next = ListNode(1)
            move = move.next 
        return dummy.next

二、第445题

1.题目介绍

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii

2.思路介绍

1.将l1和l2反转。
2.将l1的值加l2的值得dummy。
3.反转dummy

3.代码展示

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        def reverse(n):
            pre,cur = None,n
            while cur:
                cur.next,pre,cur = pre,cur,cur.next
            return pre
        l1 = reverse(l1)
        l2 = reverse(l2)
        dummy = ListNode(0)
        move = dummy
        mark = 0
        #遍历l1和l2
        while l1 and l2:
            t = l1.val + l2.val + mark
            if t >= 10:
                n = t%10 
                mark = 1
            else:
                n = t%10 
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
            l2 = l2.next
        #遍历l1
        while l1:
            t = l1.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
        #遍历l2
        while l2:
            t = l2.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l2 = l2.next
        #查漏
        if mark == 1:
            move.next = ListNode(1)
            move = move.next
        dummy.next = reverse(dummy.next)
        return dummy.next

总结

没有看大佬们的题解,自己想出来的,所以就发出来了。明示前几天写的题目都是看大佬,自己没有写出来。其中一个题目的思路是将链表连成环,再截断;另外一个题目的思路是怎么将节点设为头节点。今天的代码很容易想出来,所以写的代码很长,而大佬们代码简单而且高效,比起来感觉自己实在是太惭愧了。(PS:今天没有看大佬们的题解,明天好好看看,升华一下自己的人生)

续总结两数相加Ⅰ和Ⅱ

今天看了大佬们的代码,感觉差距挺大的,不过想想自己自学python差不多刚好2个月,就释怀了。(请记住这句话,以后我会经常用这个借口的。)
接下来说说大佬们给我眼前一亮的点。

两数相加反省

1.while l1 or l2 or s
我用的是and,所以用while用了三遍。(可能这就是学渣本渣吧)。大佬们用了一个or连接l1和l2,更强的是加上了s来判断是否进位,这样后面就不用单独判断了。
2.l1.val if l1 else 0
利用if判断这样就不用担心不能一次遍历了。

两数相加Ⅱ反省

1.利用了栈的存储特点,只能在一边进出,存储两个数。
2.一个大佬将链表转换为了数字,然后将数字相加,最后转换为字符串输出,这就是大佬嘛,i了i了呀。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页