Почему моя выходная переменная связанного списка не обновляется на каждой итерации цикла?

#python #class #linked-list

#python #класс #связанный список

Вопрос:

Я написал этот код, чтобы добавить два числа, хранящиеся в виде связанных списков, для решения проблемы с Leetcode. Я получаю вывод, который указывает, что моя переменная не обновляется в цикле while, но я не понимаю почему. Чего мне не хватает?

 # 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:
        carrybit = 0
        output = ListNode(0)
        iteration = 0
        while l1.next != None or l2.next != None:
            temp = ListNode((l1.val   l2.val   carrybit)%10)
            if l1.val   l2.val   carrybit > 9:
                carrybit = 1
            else:
                carrybit = 0

            temp2 = output.next
            while temp2 != None:
                temp2 = temp2.next
            temp2 = temp


            l1 = l1.next
            l2 = l2.next

        return output
  

Комментарии:

1. Для этого вам не нужен класс. addTwoNumbers вообще не использует свой self аргумент; это может быть просто обычная функция вместо метода класса.

2. Класс — это просто фреймворк, предоставляемый сайтом leetcode

Ответ №1:

Этот код не имеет абсолютно никакого эффекта:

         temp2 = output.next
        while temp2 != None:
            temp2 = temp2.next
        temp2 = temp
  

Значение temp2 обновляется до тех пор, пока не достигнет None , а затем заменяется на temp . После этого temp2 никогда не используется, и ни одна из них не используется temp . Им обоим присваиваются новые значения, которые не зависят от результата этой операции.

Поскольку temp назначается новая ListNode , которая ни с чем не связана и никогда не изменяется, ListNode она выйдет из области видимости и исчезнет.

Единственное, что еще происходит, это присвоение carrybit которое используется только в ListNode , которое будет удалено.

Весь цикл while заканчивается тем, что вообще ничего не делает.

Я бы предложил несколько менее запутанный подход:

 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
    output   = None
    lastNode = None
    carry    = 0
    while not (l1 is None and l2 is None):
        if l1 : carry,l1 = l1.val carry,l1.next
        if l2 : carry,l2 = l2.val carry,l2.next
        nextNode = ListNode(carry%10)
        carry = carry // 10
        if output: lastNode.next = nextNode
        else     : output        = nextNode
        lastNode = nextNode
    if carry: 
        lastNode.next = ListNode(carry%10)
    return output
  

Комментарии:

1. Хорошо, спасибо, но я получаю ошибку при тестировании вашей реализации. В частности, я получаю «Ошибка типа: __init__() принимает два позиционных аргумента, но были заданы три»

2. О, хорошо, это имеет смысл. Но для данной проблемы мы не можем изменить класс ListNode. Итак, с данным инициализатором класса, знаете ли вы лучший способ получить доступ к последнему узлу в списке и соответствующим образом изменить его?

3. Хорошо, изменил его, чтобы использовать класс ListNode как есть.

4. Кстати, я предполагаю, что начало цепочек содержит наименее значимую цифру, верно? В противном случае логику придется поменять местами.

5. Да, правильно, предполагается, что она начинается с наименьшей значащей цифры

Ответ №2:

Вы присваиваете значения локальной temp2 переменной. Выполнение этого только изменит temp2 , output.next или предыдущая temp2.next не будет изменена.

Вам действительно нужно назначить output.next , если вы хотите ее изменить.

Комментарии:

1. Хорошо, но если я не знаю глубину связанного списка, как мне получить доступ к последнему узлу и соответствующим образом обновить его?