public class LinkedList_Sort
{
    class Listnode
    {
        int data;
        Listnode next;
        public Listnode(int data){
            this.data=data;
            this.next=null;
        }
    }
    public Listnode head = null;
    public Listnode tail = null;
    public void addNode(int data)
    {
        Listnode newNode = new Listnode(data);
        if(head==null)
        {
            head = newNode;
            tail = newNode;
        }
        else{
            tail.next = newNode;
            tail = newNode;
        }
    }
    public void sortList(){
        Listnode Current_node,nextNode;
        int temp;
        Current_node = head;
        nextNode = null;
        if(head == null)
        {
            return;
        }
        else{
            while(Current_node!=null)
            {
                nextNode = Current_node.next;
                while(nextNode!=null)
                {
                    if(Current_node.data > nextNode.data)
                    {
                        temp = Current_node.data;
                        Current_node.data = nextNode.data;
                        nextNode.data = temp;
                    }
                    nextNode = nextNode.next;
                }
                Current_node = Current_node.next;
            }
        }
    }
    public void display(){
        Listnode Current_node = head;
        if(head == null)
        {
            System.out.println("Linked List is Empty");
            return;
        }
        while(Current_node != null)
        {
            System.out.println("\\n Linked list element is : "+Current_node.data);
            Current_node = Current_node.next;
        }
    }
	public static void main(String[] args) {
	    LinkedList_Sort l = new LinkedList_Sort();
	    l.addNode(10);
	    l.addNode(4);
	    l.addNode(7);
	    l.addNode(2);
	    System.out.println("\\n List before sorted array");
	    l.display();
	    System.out.println("\\n List after sorted array");
	    l.sortList();
	    l.display();
	}
}
                          // Linked List sort using QuickSort
public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public ListNode sortList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    
    ListNode pivot = head;
    ListNode lessHead = new ListNode(0);
    ListNode less = lessHead;
    ListNode equalHead = new ListNode(0);
    ListNode equal = equalHead;
    ListNode greaterHead = new ListNode(0);
    ListNode greater = greaterHead;
    
    while (head != null) {
        if (head.val < pivot.val) {
            less.next = head;
            less = less.next;
        } else if (head.val == pivot.val) {
            equal.next = head;
            equal = equal.next;
        } else {
            greater.next = head;
            greater = greater.next;
        }
        head = head.next;
    }
    less.next = null;
    equal.next = null;
    greater.next = null;
    
    ListNode sortedLess = sortList(lessHead.next);
    ListNode sortedGreater = sortList(greaterHead.next);
    
    return concat(sortedLess, equalHead.next, sortedGreater);
}

private ListNode concat(ListNode head1, ListNode head2, ListNode head3) {
    ListNode dummy = new ListNode(0);
    ListNode tail = dummy;
    tail.next = head1;
    while (tail.next != null) {
        tail = tail.next;
    }
    tail.next = head2;
    while (tail.next != null) {
        tail = tail.next;
    }
    tail.next = head3;
    return dummy.next;
}

ListNode head = ... // initialize the linked list
ListNode sortedHead = sortList(head);