pointers - 为什么我需要同时设置 tail 和 tail->next 到节点来创建排序合并列表?
问题描述
我找到了一个漂亮的代码块来创建一个排序的合并列表。但是,有两行代码我无法理解:
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
地址设置为节点。
下面的行,tail=node
将尾部本身设置为节点。完成此操作后,您将无法更改虚拟节点的指针,因此您必须事先进行设置。
推荐阅读
- c# - 无法验证对具有多个接口的模拟对象上的方法的调用
- flutter - 用 Dart ServiceStack 缓存响应?
- python - 从 Flask 请求模块读取文件
- css - Bootstrap 的 Normalize 覆盖 Boostrap.min.css
- memory-leaks - 如何将 Shark-CLI 库与 2 个 USB 连接设备一起使用?
- javascript - JavaScript function.toString() 在开玩笑时不会产生与浏览器相同的结果
- python-3.x - 将文本附加到 wx.stc.StyledTextCtrl
- powershell - 在 x509Certificates 对象 PowerShell 中找不到“AuthorityKeyIdentifier”值
- c# - .Net Core 3.0 Angular SSR 项目未运行
- vue.js - Vue:插入动态数量的道具?