class LLMergeSort(object):
    def getMid(self, llist):
        if llist.next==None:
            return llist, None
        slowp= llist
        fastp= llist.next
        while fastp:
            if fastp.next:
                fastp=fastp.next.next
            else:
                break
            llist=llist.next
        mid= llist.next
        llist.next=None
        return slowp, mid
    def merge(self,list1,list2):
        res= ListNode(0)
        backup= res
        while list1 and list2:
            if list2.val<list1.val:
                res.next=list2
                res=res.next
                list2=list2.next
                res.next=None
            else:
                res.next=list1
                res=res.next
                list1=list1.next
                res.next=None
        res.next = list1 or list2
        return backup.next
    def split(self,llist):
        start,mid=self.getMid(llist)
        if mid== None:
            return start
        else:
            return self.merge(self.split(start),self.split(mid))
        
def runLLMS():
    LL= populateLL([10,9,8,4,7,6,5,3,2,53,1])
    res= LLMergeSort().split(LL)
    print(printLL(res))
runLLMS()
1->2->3->4->5->6->7->8->9->10->53->None