Я пытался решить проблему Partition List на LeetCode. Проблема заключается в сортировке связанного списка с узлом целевого списка, так что все узлы списка, имеющие меньшее значение, чем целевое, будут поступать до цели, тогда как их первоначальный относительный порядок остается неизменным.Зачем нарушать связь между двумя узлами списка при разбиении списка?
Я смог составить простой алгоритм и передать онлайн-судье, в основном создавая два указателя и используя их каждый, чтобы связать либо узлы <
цели, либо >=
цель при перемещении по списку.
public ListNode partition(ListNode head, int x) {
ListNode ptr = head;
ListNode small = new ListNode(0);
ListNode big = new ListNode(0);
ListNode dummy_1 = big;
ListNode dummy_2 = small;
int i = 1;
while (ptr != null) {
if (ptr.val < x) {
small.next = ptr;
small = small.next;
} else {
big.next = ptr;
big = big.next;
}
ListNode help = ptr.next;
ptr.next = null;
ptr = help;
}
small.next = dummy_1.next;
return dummy_2.next;
}
следующие коды разрывает связь между ptr
и ptr.next
, и переместить
ptr
к первоначальному ptr.next
.
ListNode help = ptr.next;
ptr.next = null;
ptr = help;
То, что я не совсем понял, еще в том, что, почему этот шаг необходим, так как мы можем двигаться ptr
его next
и непосредственно обновить ссылку позже, используя small.next = ptr
и big.next = ptr
в то время как петли;
Однако, когда я просто использовал ptr = ptr.next
вместо трех строк кода выше, онлайн-судья ответил с ошибкой Memory Limit Exceeded
.
Я был бы очень признателен, если кто-нибудь сможет это объяснить. Что может вызвать ошибку ограничения памяти, поскольку, как представляется, уже избегается какой-либо циклический список?
Вы пишете это на Java или C++? Ваш код C++, но ваш тег - Java – JavaHopper
Однако эти 3 строки необходимы для восстановления памяти.Если вы просто продвигаете указатель, узлы не удаляются, а ptr указывает на следующий узел в цепочке – JavaHopper
@JavaHopper Спасибо за ваш ответ! Код действительно в java, извините, если стиль кодирования смущает вас. Итак, я думаю, что алгоритм может работать, по методу? Это просто занимает лишнее пространство памяти? – GettingBetter