Не могу понять, когда использовать фиктивный узел в вопросах с кодом доступа

#python #linked-list

Вопрос:

Я работаю над вопросом 21 по литкоду (Объединение двух отсортированных списков)

Объедините два отсортированных связанных списка и верните их в виде отсортированного списка. Список должен быть составлен путем объединения узлов первых двух списков.

Входные данные: l1 = [1,2,4], l2 = [1,3,4]

Вывод: [1,1,2,3,4,4]

Типичное решение на python выглядит следующим образом:

 class Solution:
    def mergeTwoLists(self, l1, l2):
        dummy = ListNode(None)
        res = dummy
       # why can't I just define res as res = ListNode(None)
        
        while l1 and l2:
            if l1.val<= l2.val:
                res.next = l1
                l1 = l1.next
            else:
                res.next = l2
                l2 = l2.next
            res = res.next
            
        if l1: 
            res.next = l1
        if l2:
            res.next = l2
        return dummy.next
 

Мой вопрос: почему я не могу просто определить res как res = ListNode(нет) в начале и вернуть res.next в качестве вывода? Какова функция фиктивного узла здесь?

Хотя приведенный выше код работает, я также не могу понять, почему. Мы инициировали res как фиктивный узел, но мы вообще не изменили фиктивную переменную в последующем коде. Таким образом, dummy должен оставаться в качестве ListNode(Нет)все время, и мы должны возвращать res.next вместо dummy.next. Тогда почему мы возвращаем dummy.next в конце?

Чтобы лучше проиллюстрировать, я думаю, что приведенный выше код делает что-то похожее на приведенный ниже пример, что для меня не имеет особого смысла

 a = 3
b = a
b = b 2  #or any code that changes something in b, but does not change a
return a # and the output turns out to be a =5, which is clearly a wrong answer

##############################
The above linked list did similar things:

dummy = ListNode(None)
res = dummy

some other code #The while loop that did something to res, but did nothing to dummy

return dummy 
#how can we possibly get a dummy that is not None, since the while loop did nothing to it?
 

Ответ №1:

на протяжении всего цикла while res переменная фактически продвигается res = res.next вперед, см.

Но манекен всегда указывает на начальный узел. Таким образом, вам это нужно, чтобы иметь доступ ко всему ListNode, а не только к последнему узлу, res на который указывает в конце выполнения.

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

1. Я хотел бы явно подчеркнуть, что назначение объектов в Python-это копирование ссылки, а не копирование самого объекта. Следовательно, dummy действительно меняется, res потому что они ссылаются на один и тот же объект в памяти.

2. Большое спасибо, братан! ты решил мою проблему!

3. @Cairo, затем вы должны пометить ответ как принятый.