Merge sort with a linked list
Starting with some Java API documentation:


  public class NoSuchElementException
  extends RuntimeException
  
  Thrown by the nextElement method of an Enumeration to indicate that there are no more elements in the enumeration.


This is not an Enumeration and you have not called nextElement().  This is not an appropriate exception

sort() should really take a list as a parameter and return a sorted list.  Give it a list as a parameter; if a null is passed, Java will do you a nice NullPointerException, free of charge.  If the given list is simply empty, return an empty list.  Being asked to sort an empty list is not an exceptional error situation.  It's no more an error than being asked to sort a list with 1 element, which you do show you can do.

Which brings me to the more important stuff...

Method and object conflated and confused.

You've combined a sorting algorithm with the (hand-rolled) list to be sorted.  It would be better to have a properly usable list class and either a mergeSort method on that class or a static helper class with a MergeSort method that can act on any list object.  Then you could create a list, examine it to show that it was a well-functioning and populated list, create a mergeSort()-ed version, check that this was a valid list, that it still had all the right elements (none missing, none added or substituted) and that they were in the desired order.  You'd have something useful you could do more with.

List object cannot be tested/examined.

This is part of the problem created by the previous issue.  There's no way to get at the list data.  You print it out on the screen, but it's inaccessible to the rest of your code.  What use was the sort?  Did it even work?  How is this validated except by the naked eye?  Since you don't print the unsorted version out on the screen, how does the viewer know you did anything?

Make the list fully usable.  Provide a way to traverse and inspect it.  Then your code can verify the sort (and do something useful with the sorted data afterwards, if you like).

Printing directly from within the merge class.

Don't do this.  Have your class methods return useful values which can be inspected and tested.  Print out the results in your main method if you want, but don't litter your classes with println statements.

Final, what?

What do you think you are gaining with those final keywords?  Those local variables are going to evaporate when that tiny method returns, so what have you achieved?

I should go on to examine the actual sorting algorithm but I think I'll leave that to somebody else - it's late and I'm tired.