我正在解决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?
在整个while循环中,res
变量实际上会前进,请参阅res=res.next
。
但是哑总是指向初始节点。所以你仍然需要它能够访问整个ListNode,而不仅仅是res
在执行结束时指向的最后一个节点。