加两个数字的问题(链接列表)-Python-Leetcode-AttributeError

时间:2019-12-25 20:14:03

标签: python-3.x list data-structures linked-list attributeerror

我正在尝试解决此问题-将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

4 个答案:

答案 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时,有时abqNone

我不会弄清楚为什么,相反,我将解释您应该如何解决此问题。


像这样指定问题的原因是这样,您可以编写一个有效的解决方案。问题是提示您编码基本单位(例如,单位,数十,数百,数千等)中的长加法。

数字是相反的,因此您可以从单位开始并携带超过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的开头加上进位号作为值。然后为l2l1获取下一个并重复。如果随时缺少l2l1,请将该值计为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