语句时的链接列表(来自LeetCode的addTwoNumbers)

时间:2019-12-04 02:18:38

标签: python singly-linked-list

下面是我提交并随后被接受的代码。

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 

2 个答案:

答案 0 :(得分:0)

可能有一个测试用例,其中传递给l1和/或l2的值为None。如果发生这种情况,则会引发AttributeError,因为None没有任何这样的属性-它只是None(在其他语言中为null)。

请注意,您通过简单地从while语句中的每个l1和l2中删除.val来解决了检查无的问题。这就是第二次提交被成功接受的原因。

答案 1 :(得分:0)

因为l1l2NoneType或本质上是None,这意味着它们实际上不是您想要的类型。 None如何进入这里?好吧,两种方法之一:

首先,是有人可以像输入Nonel1一样传递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循环之前 ,因此,每次迭代该循环时,l1l2都会获得不同的值。您已确保传入不是None。但这并没有阻止l1l2以后成为None