今天来做一道LeetCode吧。
第一次代码(抄的):
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
num1 = []
num2 = []
while l1:
num1.append(l1.val)
l1 = l1.next
while l2:
num2.append(l2.val)
l2 = l2.next
ret = len(num1) - len(num2)
if ret < 0:
ret *= -1
num1.extend([0] * ret)
elif ret > 0:
num2.extend([0] * ret)
ret = 0
num3 = []
for n1, n2 in zip(num1, num2):
val = (n1 + n2 + ret) % 10
num3.append(val)
ret = (n1 + n2 + ret) // 10
if ret != 0:
num3.append(ret)
result = None
num3.reverse()
for a in num3:
result = ListNode(val=a, next=result)
return result
通过是通过了,但是运行的结果不太理想。显然,速度和内存都不太行。
好的,我们来优化我们的代码。
首先,我们看到这个方法的一开始的思路是把ListNote类型的数据保存在列表中,在列表中进行运算后再将结果列表储存成ListNote类型。
所以,我们可以先简化第一步,直接通过ListNote类型的数据进行运算,不将l1,l2转换为列表。代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
ret=0
result=None
num3=[]
while l1 or l2:
if l1==None:
num1=0
else:
num1=l1.val
if l2==None:
num2=0
else:
num2 = l2.val
value = (num1+num2+ret)%10
num3.append(value)
ret = (num1+num2+ret)//10
if l1!=None:
l1 = l1.next
if l2!=None:
l2 = l2.next
if ret!=0:
num3.append(ret)
num3.reverse()
for i in range(len(num3)):
result=ListNode(val=num3[i] ,next=result)
return result
好了,进行多次试错后,成功运行。但是仅仅把速度提升了一点,并没有改变如此大的内存。
啊,内存消耗仅仅击败了5%的用户(咸鱼瘫)。
用时减少的原因:假设循环次数相同,那么相比第一次的代码,我优化后的代码已经减少了一个循环,所以会减少1/3的时间复杂度。
但是...进行多次提交后,我发现...
内存消耗一直保持比较高的状态;但是执行用时波动还挺大的。好吧,今天是一次无效的优化...