В настоящее время я пытаюсь сформулировать механизм mergeSort для односвязного списка. Благодаря исследованиям и нахождению согласованных представлений об А) сортировке слиянием, являющейся лучшим способом сортировки односвязных списков, и Б) о том, что это ключевые компоненты для выполнения такой операции, я пришел к следующему коду. Он почти работает точно так, как задумано, но вернет только все целые числа, которые больше последнего введенного числа. Например, ввод 7, 6, 5, 4, 3, 2, 1 вернет 1, 2, 3, 4, 5, 6, 7, а ввод 1, 2, 3, 4, 5 вернет только 5. I Я использовал случайные порядки ввода, поэтому проблема заключается не только в вводе чисел в обратном порядке, но буквально в любом порядке. Если число меньше окончательного, оно удаляется из списка в процессе сортировки. Я не могу найти причину этого вообще. Моя первоначальная проблема была вызвана ошибкой, когда l oop останавливал итерации после одной go, поэтому, как только я удалил, сортировка слиянием работала, но для этой проблемы я только что описал.
Любые советы и предложения приветствуются, и спасибо за ваш вклад. Мои знания о связанных списках и рекурсии не самые большие, поэтому я действительно приветствую любую входную / конструктивную критику здесь.
public Node mergeSort(Node head) {
if (head == null || head.getNext() == null) return head;
Node midpoint = findMidpoint(head);
Node rightliststart = midpoint.getNext();
midpoint.setNext(null);
Node rightlist = mergeSort(rightliststart);
Node sorted = sort(leftlist, rightlist);
return sorted;
}
public Node findMidpoint(Node head) {
if (head == null) return head;
Node slowpointer = head;
Node fastpointer = slowpointer.getNext();
while (fastpointer != null) {
fastpointer = fastpointer.getNext();
if (fastpointer != null) {
slowpointer = slowpointer.getNext();
fastpointer = fastpointer.getNext();
}
}
return slowpointer;
}
public Node sort(Node one, Node two) {
Node temp = null;
if (one == null) return two;
if (two == null) return one;
if (one.getData() <= two.getData()) {
temp = one;
temp.setNext(sort(one.getNext(), two));
} else {
temp = two;
temp.setNext(sort(one, two.getNext()));
}
return temp;
}