为什么需要在节点上同时设置tail和tail-> next来创建排序的合并列表?

问题描述 投票:0回答:1

我发现了一个漂亮的代码块来创建排序的合并列表。但是,有两行代码我无法解决:

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。”,我的代码就会中断。

谢谢!

pointers linked-list
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.