下面是我提交并随后被接受的代码。
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result = ListNode(0)
result_tail = result
carry = 0
while l1 or l2 or carry:
val1 = (l1.val if l1.val else 0)
val2 = (l2.val if l2.val else 0)
out = (val1+val2 + carry)%10
carry = (val1+val2 + carry)//10
result_tail.next = ListNode(out)
result_tail = result_tail.next
l1 = (l1.next if l1.next else None)
l2 = (l2.next if l2.next else None)
return result.next
最初,我有while l1.val or l2.val or carry:
,但是它被拒绝并显示一条错误消息,内容如下:
AttributeError:'NoneType'对象具有njo属性'val'
但是,链接的节点列表l1和l2显然具有val和next属性。
我不确定while l1.val or l2.val or carry:
为什么不起作用。
下面是我最初提交但被拒绝的代码。
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result = ListNode(0)
result_tail = result
carry = 0
print(l1.val)
print(l2.val)
while l1.val or l2.val or carry:
val1 = (l1.val if l1.val else 0)
val2 = (l2.val if l2.val else 0)
out = (val1+val2 + carry)%10
carry = (val1+val2 + carry)//10
result_tail.next = ListNode(out)
result_tail = result_tail.next
l1 = (l1.next if l1.next else None)
l2 = (l2.next if l2.next else None)
return result.next
答案 0 :(得分:0)
可能有一个测试用例,其中传递给l1和/或l2的值为None。如果发生这种情况,则会引发AttributeError,因为None没有任何这样的属性-它只是None(在其他语言中为null)。
请注意,您通过简单地从while语句中的每个l1和l2中删除.val来解决了检查无的问题。这就是第二次提交被成功接受的原因。
答案 1 :(得分:0)
因为l1
或l2
是NoneType
或本质上是None
,这意味着它们实际上不是您想要的类型。 None
如何进入这里?好吧,两种方法之一:
首先,是有人可以像输入None
或l1
一样传递l2
。
几乎可以肯定是您的问题的第二个原因是它来自以下语句:
l1 = (l1.next if l1.next else None)
l2 = (l2.next if l2.next else None)
换句话说,如果没有下一个值,我们将确保将其设置为None。然后,因为我们在l1 or l2 or carry
的条件下循环,所以其中只有一个必须是“真实的”。换句话说,l1
可能为None,而l2
可能是下一次迭代的有效列表,反之亦然...或进位是真实的。或两者兼有。
适合您的情况l1 or l2 or carry
的真值表,以更好地显示:
l1 | l2 | carry | result
------------------------
T---T----T------| T
T---F----T------| T
T---T----F------| T
T---F----F------| T
F---T----T------| T
F---F----T------| T
F---T----F------| T
F---F----F------| F
由于None
是“虚假”类型,因此None
的计算结果为False
,但要使False
的所有这三个条件都不能继续循环。
至于开始时的打印,它们是在while循环之前 ,因此,每次迭代该循环时,l1
和l2
都会获得不同的值。您已确保传入不是None
。但这并没有阻止l1
和l2
以后成为None
。