Skip to content

Instantly share code, notes, and snippets.

@sreeprasad
Created September 24, 2014 03:12
Show Gist options
  • Save sreeprasad/6e8d4619786299669086 to your computer and use it in GitHub Desktop.
Save sreeprasad/6e8d4619786299669086 to your computer and use it in GitHub Desktop.
Sort Linked List
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode left = head;
ListNode right = null;
ListNode p1 = head;
int count =0;
while(p1!=null){
count++;
p1=p1.next;
}
int halfCount =0;
int middle = count/2;
p1=head;
while(p1!=null){
halfCount++;
ListNode next = p1.next;
if(halfCount==middle){
right = next;
p1.next = null;
}
p1=p1.next;
}
ListNode leftHalf = sortList(left);
ListNode rightHalf = sortList(right);
ListNode mergeList = merge(leftHalf,rightHalf);
return mergeList;
}
private ListNode merge(ListNode left, ListNode right){
ListNode p1 = left;
ListNode p2 = right;
ListNode fakeHead = new ListNode(100);
ListNode nNext = fakeHead;
while( p1!=null || p2!=null ){
if(p1==null){
nNext.next = new ListNode(p2.val);
p2 = p2.next;
nNext = nNext.next;
}else if(p2==null){
nNext.next = new ListNode(p1.val);
p1 = p1.next;
nNext = nNext.next;
}else{
if(p1.val<p2.val){
nNext.next = new ListNode(p1.val);
p1 = p1.next;
nNext = nNext.next;
}else if(p1.val==p2.val){
nNext.next = new ListNode(p1.val);
nNext = nNext.next;
p1 = p1.next;
nNext.next = new ListNode(p2.val);
p2 = p2.next;
nNext = nNext.next;
}else{
nNext.next = new ListNode(p2.val);
p2 = p2.next;
nNext = nNext.next;
}
}
}
return fakeHead.next;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment