Microsoft Interview Question
Software Engineer / DevelopersCountry: India
Interview Type: In-Person
public void mergeSort() {
this.sortedHead = split(getHead());
}
private LinkListNode<E> split(LinkListNode<E> head) {
if (head.getNext() == null || head == null)
return head;
LinkListNode<E> firstHalf = getMiddleElement(head);
LinkListNode<E> secondHalf = firstHalf.getNext();
firstHalf.setNext(null);
head = merge(split(head), split(secondHalf));
return head;
}
private LinkListNode<E> merge(LinkListNode<E> splitHead1,
LinkListNode<E> splitHead2) {
LinkListNode<E> dummyHead = new LinkListNode<E>();
LinkListNode<E> lastPos = dummyHead;
while (splitHead1 != null && splitHead2 != null) {
if ((Integer) splitHead1.getData() <= (Integer) splitHead2
.getData()) {
lastPos.setNext(splitHead1);
splitHead1.setPrev(lastPos);
splitHead1 = splitHead1.getNext();
lastPos = lastPos.getNext();
} else {
lastPos.setNext(splitHead2);
splitHead2.setPrev(lastPos);
splitHead2 = splitHead2.getNext();
lastPos = lastPos.getNext();
}
}
//If any remaining elements in any of the two link lists ...
while (splitHead1 != null) {
lastPos.setNext(splitHead1);
splitHead1.setPrev(lastPos);
splitHead1 = splitHead1.getNext();
lastPos = lastPos.getNext();
}
while (splitHead2 != null) {
lastPos.setNext(splitHead2);
splitHead2.setPrev(lastPos);
splitHead2 = splitHead2.getNext();
lastPos = lastPos.getNext();
}
return dummyHead.getNext();
}
private LinkListNode<E> getMiddleElement(LinkListNode<E> head) {
if (head == null)
return null;
if (head.getNext() == null)
return head;
int count = 0;
LinkListNode<E> fastP = head, slowP = head;
while (fastP.getNext() != null) {
fastP = fastP.getNext();
count++;
if (count % 2 == 0)
slowP = slowP.getNext();
}
return slowP;
}
- pavel.em October 18, 2011