Return merge(merge_sort(left_head), merge_sort(right_head)) //recurse on that Middle.next = null //split the list into two halfs Node middle = getMiddle(head) //get the middle of the list Wonder why it should be big challenge as it is stated here, here is a straightforward implementation in Java with out any 'clever tricks'.