Próbuję rozwiązać to pytanie: "Rozmieść elementy na danej liście połączonej tak, aby wszystkie liczby parzyste były umieszczone po liczbach nieparzystych. Odpowiednia kolejność elementów powinna pozostać taka sama."Sortowanie LinkedList nawet po elementach nieparzystych
Jest to kod używam:
class Node<T> {
T data;
Node<T> next;
Node(T data) {
this.data = data;
}
}
Jest to główny logika:
static Node<Integer> sortOddEven(Node<Integer> head) {
if(head == null || head.next == null) {
return head;
}
Node<Integer> middle = getMiddle(head);
Node<Integer> nextOfMiddle = middle.next;
middle.next = null;
Node<Integer> temp1 = sortOddEven(head);
Node<Integer> temp2 = sortOddEven(nextOfMiddle);
Node<Integer> sortedList = sortOddEvenMerger(temp1, temp2);
return sortedList;
}
static Node<Integer> sortOddEvenMerger(Node<Integer> head1, Node<Integer> head2) {
Node<Integer> head3 = null, tail3 = null;
if(head1.data.intValue()%2 != 0) {
head3 = head1;
tail3 = head1;
head1 = head1.next;
} else {
head3 = head2;
tail3 = head2;
head2 = head2.next;
}
while(head1 != null || head2 != null) {
if(head1 == null) {
tail3.next = head2;
return head3;
} else if(head2 == null){
tail3.next = head1;
return head3;
}
if(head1.data.intValue()%2 != 0) {
tail3.next = head1;
tail3 = tail3.next;
head1 = head1.next;
} else {
tail3.next = head2;
tail3 = tail3.next;
head2 = head2.next;
}
}
tail3.next = null;
return head3;
}
Zasadniczo mam manipulowane MergeSort
algorytm trochę rozwiązać ten jeden, jeśli napotykają dziwne elementy, dodaję je najpierw w metodzie sortOddEvenMerger
, a nawet elementy po nich. Ale względna kolejność elementów ulega zmianie.
Przykład: Wejście - 1 4 5 2
Przewidywana moc - 1 5 4 2
moje wyjście - 1 5 2 4
Jak mogę dostosować go więcej, aby utrzymać względna kolejność?
Z pewnością ostatnim krokiem jest "O (1)", jeśli utrzymujesz odniesienie do ostatniego 'Węzła' na liście parzystej i na czele listy parzystej? 'oddCurrent.next = evenHead' (oczywiście należy dodać kontrole, aby zapewnić' oddCurrent! = null', co jest możliwe). Sądzę, że sądząc po tym, co powiedziałeś, "O (n)" było literówką. –
Dzięki za komentarz !!! Właściwie to nie myślałem w ogóle, ponieważ O (n) na ostatnim kroku nie zmieniłoby ogólnej złożoności, ale tak, masz całkowitą rację !! (Będę edytować odpowiedź jeszcze raz!). – coder
pod względem wielkich O nie, ale w praktyce tak. Za chwilę skasuję swój komentarz, aby utrzymać odpowiedź w porządku, co było poza tym na miejscu. –