我试图解决这个问题:“安排在一个给定的链表的元素,使得所有的偶数号码奇数后放置元素各自的顺序应保持相同的”排序的LinkedList甚至后奇数元素
这是我使用的代码:
class Node<T> {
T data;
Node<T> next;
Node(T data) {
this.data = data;
}
}
这是主要的逻辑:
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;
}
基本上我已经调整了MergeSort
算法一点点地解决这一个,如果我遇到奇元素,我首先在sortOddEvenMerger
方法中添加它们,甚至在它们后面添加元素。但元素的相对顺序发生了变化。
实施例:输入 - 1 4 5 2
预期输出 - 1 5 4 2
我的输出 - 1 5 2 4
如何可以调整它更维持相对顺序?
当然最后一步是'O(1)'如果你维持奇名单到最后'Node'参考和的头,甚至列出? 'oddCurrent.next = evenHead'(当然,应该添加检查以确保'oddCurrent!= null',这是可能的)。我猜你认为'O(n)'是一个错字。 –
感谢您的评论!其实我完全没有想过,因为最后一步O(n)不会改变整体的复杂性,但是你完全正确! (我会再次编辑答案,谢谢!!)。 – coder
就大O而言,但在实践中是的。我会立刻删除我的评论,以保持答案的整洁,否则这个问题就会出现。 –