两数之和
【今日知图】
标记
某一块代码可能需要稍后处理
使用m增加一个标记,标记名称可以是a~z和A~Z之间的任意一个字母;
添加标记了的行如果被删除,标记同时被删除;
后面的标记名与前面一致会覆盖前面相同的标记;mx mark 添加标记x,x可以是a~z和A~Z之间的任意一个字母
'x 直接定位到标记x所在位置
0.说在前面1.两数之和2.思路分析3.实现方法4.算法分析5.作者的话
0.说在前面
又到了新的一周,我们这周的第一篇LeetCode,有关链表话题,在python中如何操作链表,定义链表呢?有关这个问题,大家可以留言,将情况反馈,我根据情况发文,本来惯例周二发文,实际上是每周一刷题,但是由于时间安排问题放在了周二,所以以后还是惯例周二,但是本周二被安排了,所以提前发文LeetCode!
下面一起来看本次刷题,两数之和!!!
1.两数之和问题
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 单位 数字。
如果,我们将这两个数起来相加起来,则会返回出一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2.思路分析
【方法一】
将l1链表的数取出,组成一个数,l2同理,最终求和,将求和结果循环得出每个节点的值,然后链表连接即可!!!
【方法二】
边循环max(len(l1),len(l1)),边求和,边插入新链表数!!!
3.实现方法
【方法一】def addTwoNumbers(self, l1, l2):
sum_l1 = 0
muti = 1
while l1:
sum_l1 += l1.val*muti
l1=l1.next
muti*=10
sum_l2 = 0
muti = 1
while l2:
sum_l2 += l2.val*muti
l2=l2.next
muti*=10
sum_res = sum_l1+sum_l2
print(sum_res)
l = ListNode(0)
p = l
if not sum_res:
return [0]
while sum_res!=0:
r = sum_res%10
sum_res = sum_res//10
p.next = ListNode(r)
p = p.next
p.next = None
p=l.next
del l
return p
【方法二】def addTwoNumbers(self, l1, l2):
if not l1:
return l2
if not l2:
return l1
up = 0
head = ListNode(0)
p = head
while l1 or l2:
curr_sum = 0
if l1:
curr_sum+=l1.val
l1=l1.next
if l2:
curr_sum+=l2.val
l2=l2.next
curr_val = (curr_sum+up)%10
up = (curr_sum+up)//10
p.next = ListNode(curr_val)
p=p.next
if up:
p.next = ListNode(1)
p=p.next
p.next = None
p = head.next
del head
return p
4.算法分析
方法时间复杂度空间复杂度算法一O(n)O(n)
算法二O(n)O(n)
对比发现两者时间复杂度与空间复杂度一致,那为什么还会有这么大的提交结果差异?
原因在于,第一个算法有三个循环,虽然都是O(n),但是耗时三倍!!!