我正在尝试解决此问题-将Leetcode上的两个数字相加
我试图将两个链接列表都转换为数组,然后执行添加操作。现在,我正在努力将它们转换回链接列表,这是该问题的理想输出。
有人可以检查我要去哪里吗?我也遇到了属性错误:
AttributeError:'NoneType'对象没有属性'val'
这是我写的代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
a = l1 #pointers
b = l2 #pointers
arr1 = []
arr2 = []
while a.next is not None:
arr1.append(a.val)
a = a.next
arr1.append(a.val) #storing the values of linked lists in arrays/lists
while b.next is not None:
arr2.append(b.val)
b = b.next
arr2.append(b.val) #storing the values of linked lists in arrays/lists
rev1 = reversed(arr1) #reversed list
rev2 = reversed(arr2) #reversed list
inta = "".join(str(rev1)) #converting list to strings
intb = "".join(str(rev2))
c = str(inta + intb) #performing addition - the answer we wanted
revc = reversed(c) #answer in string form - reversed (output in string at present)
#trying to convert into linked list and return it
q = l1
for i in revc:
q.val = i
q = q.next
return l1
答案 0 :(得分:1)
NoneType
意味着您正在使用None
来处理Class或Object的实例。当分配或函数调用失败或返回意外结果时,就会发生这种情况。
NoneType
是值None
的类型。在这种情况下,变量生存期的值为None
。通常发生的情况是调用缺少返回值的函数。
答案 1 :(得分:1)
我在Python3中做到了,建议您在Python3中工作。
对于反转操作,您也可以使用就地使用的.reverse()
,因此不必创建新变量。
此外,您的.join()
操作不正确。您需要遍历每个列表中的每个字符,而不是要做的是对列表进行字符串表示。
返回的链表的构造涉及为该列表的开头分配一个值,然后根据需要在遍历结果字符串时在新的ListNodes中添加数字。
我应该说,尽管我相信您的问题是一种新颖的解决方案,但我认为问题的实质是让您更轻松地使用链表。因此,我认为围绕它们开展工作有点违背了这一目标。
话虽如此,这是一种内存效率很高的解决方案,因为列表是Python中非常优化的数据结构。
祝您编码愉快!
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
a = l1 #pointers
b = l2 #pointers
arr1 = []
arr2 = []
while a:
arr1.append(a.val)
a = a.next
while b:
arr2.append(b.val)
b = b.next
arr1.reverse()
arr2.reverse()
inta = int("".join(str(x) for x in arr1)) #converting list to strings
intb = int("".join(str(x) for x in arr2))
c = list(str(inta + intb)) #performing addition - the answer we wanted
# assign last digit to new ListNode which represents the head of returned LL
head = l3 = ListNode(c.pop())
c.reverse()
# traverse remaining digits, assigning each to new ListNode
for i in c:
l3.next = ListNode(i)
l3 = l3.next
return head
答案 2 :(得分:1)
您的错误是因为在尝试访问App
时,有时a
,b
或q
是None
。
我不会弄清楚为什么,相反,我将解释您应该如何解决此问题。
像这样指定问题的原因是这样,您可以编写一个有效的解决方案。问题是提示您编码基本单位(例如,单位,数十,数百,数千等)中的长加法。
数字是相反的,因此您可以从单位开始并携带超过10的任何东西。
.val
这样思考意味着您可以编写一个效率更高的响应。复杂度为243
564
^
start here
2 + 5 = 7, carry 0
243
564
^
4 + 6 = 0, carry 1
243
564
^
3 + 4 (+ 1) = 8, carry 0
therefore the answer is
7 -> 0 -> 8
,而您的方法复杂度为O(max(len(a), len(b)))
。差异不大,但是计算浪费很多,而且不容易理解。
我确定这里可以进行逻辑上的改进,但这是我认为您应该针对的解决方案:
O(8*max(len(a), len(b)))
编辑:经过进一步的思考,我意识到您也可以通过递归很好地完成它。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
carry = 0
original = value = ListNode(None)
while True:
if l1 is None and l2 is None:
value.val = carry
break
elif l1 is None:
value.val = l2.val + carry
carry = 0
l2 = l2.next
elif l2 is None:
value.val = l1.val + carry
carry = 0
l1 = l1.next
else:
car, val = divmod(l1.val + l2.val, 10)
value.val = val + carry
carry = car
l1, l2 = l1.next, l2.next
value.next = ListNode(None)
value = value.next
return original
您可以随时创建class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def recursive_wrapper(l1, l2, carry):
if l1 is None and l2 is None:
return None
elif l1 is None:
res = ListNode(l2.val + carry)
res.next = add_two_recursive(None, l2.next, 0)
elif l2 is None:
res = ListNode(l1.val + carry)
res.next = add_two_recursive(l1.next, None, 0)
else:
car, val = divmod(l1.val + l2.val, 10)
res = ListNode(val + carry)
res.next = add_two_recursive(l1.next, l2.next, car)
return res
return recursive_wrapper(l1, l2, 0)
。在每个点上,它都是ListNode
的开头加上l1
的开头加上进位号作为值。然后为l2
和l1
获取下一个并重复。如果随时缺少l2
或l1
,请将该值计为l2
。一旦没有更多的数字,请返回0
表示结果的结尾。
答案 3 :(得分:0)
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
carry = 0
head = curr = ListNode()
while l1 and l2:
total = l1.val + l2.val + carry
curr.next = ListNode(total% 10)
carry = total // 10
l1,l2,curr = l1.next, l2.next,curr.next
while l1:
total = l1.val + carry
curr.next = ListNode(total%10)
carry = total // 10
l1, curr = l1.next, curr.next
while l2:
total = l2.val + carry
curr.next = ListNode(total%10)
carry = total//10
l2, curr = l2.next, curr.next
if carry > 0:
curr.next = ListNode(carry)
return head.next