Python3 & Java 4 pointers solution
\n# Definition for singly-linked list.\n# class ListNode:\n#     def __init__(self, val=0, next=None):\n#         self.val = val\n#         self.next = next\ncl
```\n# Definition for singly-linked list.\n# class ListNode:\n#     def __init__(self, val=0, next=None):\n#         self.val = val\n#         self.next = next\nclass Solution:\n    def insertionSortList(self, head: ListNode) -> ListNode:\n        # if head is empty or only have 1 element, return head\n        if not head: return None\n        if not head.next: return head\n        \n        # Need four pointers and we are going to sort right at the same place\n        # define dummy to hold the begining of the sorted list,\n        # define temp to hold a value if order need to be changed\n        # define current to loop over the list to be sorted\n        # define runner to loop over the sorted linklist from dummy ->-> current\n        \n        dummy = ListNode(None,head)\n        current = head\n        \n        while current.next is not None:\n            # if in-order, move to the next number\n            if current.next.val >= current.val:\n                current = current.next\n                \n            # if current.next.val < current.val, list is not in-order, \n            # we need to remove the current number from the origional linklist, \n            # then do insertion from dummy.next     \n            else: \n                temp = current.next\n                runner = dummy\n                current.next = current.next.next\n                \n                # insert the value in the sorted linklist\n                while runner.next.val <= temp.val:\n                    runner = runner.next\n                runner.next, temp.next = temp, runner.next\n                \n        return dummy.next   \n                \n        \n        \n        \n        \n```\n\n\n```\n/**\n * Definition for singly-linked list.\n * public class ListNode {\n *     int val;\n *     ListNode next;\n *     ListNode() {}\n *     ListNode(int val) { this.val = val; }\n *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }\n * }\n */\nclass Solution {\n    public ListNode insertionSortList(ListNode head) {\n        // if head.size is samller than 2, we can just return head\n        if(head==null || head.next ==null) return head;\n        \n         // use current to go thourgh the linklist\n\t\t // use temp to store the not-in-order element\n\t\t // use runner to loop over the sorted linklist\n\t\t \n        ListNode dummy = new ListNode(-1,head);\n        ListNode current = head;\n        ListNode temp = null;\n        ListNode runner = null;\n        \n        while (current.next!=null){\n            // if current.next bigger than current, we do not need to change the order\n            if (current.next.val >= current.val){\n                current = current.next;\n            }else{\n                runner = dummy;\n                temp =   current.next; // save the not in-order element to temp\n                current.next = current.next.next;//remove the not in-order element from the list\n                \n                // use runner, looping from dummy, to find where to insert temp\n                while (runner.next.val <= temp.val){\n                    runner = runner.next;\n                }\n                // find the place to insert, re-build the sorted link-list    \n                    temp.next = runner.next;\n                    runner.next = temp;\n            }\n        }\n        return dummy.next;\n    }\n}\n```
['Java', 'Python3']