Почему мне нужно установить как tail, так и tail-> рядом с узлом, чтобы создать отсортированный объединенный список? - PullRequest
0 голосов
/ 21 марта 2020

Я нашел отличный блок кода для создания отсортированного объединенного списка. Однако есть две строчки кода, которые я не могу обернуть вокруг:

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".

Спасибо!

1 Ответ

1 голос
/ 21 марта 2020

Кажется, я ответил на свой вопрос. На первой итерации while l oop, tail->next=node устанавливает адрес фиктивного узла next в узел.

Следующая строка, tail=node, устанавливает сам хвост в узел. После этого вы теряете доступ к изменению указателей фиктивного узла, поэтому вы должны установить это заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...