首页 > 解决方案 > 为什么我需要同时设置 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”,我的代码就会中断。

谢谢!

标签: pointerslinked-list

解决方案


我想我回答了我自己的问题。在 while 循环的第一次迭代中,tail->next=node将虚拟节点的next地址设置为节点。

下面的行,tail=node将尾部本身设置为节点。完成此操作后,您将无法更改虚拟节点的指针,因此您必须事先进行设置。


推荐阅读