我是编码新手,正在处理LeetCode#21合并两个排序列表。
例如:输入:list1=[1,2,4],list2=[1,3,4]输出:[1,1,2,3,4,4]
这个问题的一个常见解决方案是:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
dummy = ListNode()
tail = dummy
while list1 and list2:
if list1.val < list2.val:
tail.next = list1
list1 = list1.next
else:
tail.next = list2
list2 = list2.next
tail = tail.next
if list1:
tail.next = list1
elif list2:
tail.next = list2
return dummy.next
我对最后一行感到困惑:返回dummy.next
它不应该简单地返回虚拟节点的下一个节点吗?这将如何返回整个列表?
Dummy被创建为一个临时头,因为一开始我们不知道我们的头是以list1还是list2开头。
在我们完成合并之后,dummy将看起来像这样。伪值为0,因为这是调用ListNode()
时的默认值。
0 > 1 > 1 > 2 > 3 > 4 > 4
但我们的原始列表没有0,因此0被dummy.next
删除
dummy.next会是这样的。
1 > 1 > 2 > 3 > 4 > 4
这将返回整个列表,因为每个ListNode都将其next
值存储在self.next
属性中。
你可以看看这个。当链表的self.next
为None时,我们知道我们已经到达了链表的结束节点。
current = dummy.next;
while current is not None:
print(current.val);
current = current.next;