There are couple of problems with your code. Your approach is right though
In join method you are leaving some of the elements in list because of your while loop is using
lp < left.size() && rp < right.size()
which will loop until one of the lists have been added to the fin and there might still be some element left in other list. so you need two more loops to accommodate this:
while(lp < left.size()) { fin.add(left.get(lp++)); } while(rp < right.size()) { fin.add(right.get(rp++)); }
there is problem in your msort method as well you are not using the return values from msort so you need this:
left = msort(left);
right = msort(right);
Hope this helps.