一、第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了呀。