我发现了一个漂亮的代码块来创建排序的合并列表。但是,有两行代码我无法解决:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode *tail = &dummy;
while(l1 && l2) {
ListNode *& node = l1->val < l2->val? l1 : l2;
tail->next = node;
tail = node;
node = node->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
为什么在设置tail->next = node
之前需要先设置tail = node
?我注意到无论如何“ tail = node”都会覆盖上一行中的分配。
但是我也注意到,如果没有“ tail-> next = node。”,我的代码就会中断。
谢谢!
我想我回答了我自己的问题。在while循环的第一次迭代中,tail->next=node
将虚拟节点的next
地址设置为node。
下一行tail=node
将尾巴本身设置为node。完成此操作后,您将无法更改虚拟节点的指针,因此必须事先进行设置。