提问者:小点点

无法理解leetcode问题中何时使用虚拟节点


我正在解决leetcode问题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作为哑节点发起,但是在后续的代码中完全没有改变变量哑节点。所以哑节点应该一直保持为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在执行结束时指向的最后一个节点。