#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. Хорошо, но если я не знаю глубину связанного списка, как мне получить доступ к последнему узлу и соответствующим образом обновить его?