The diff() method is recursive.  When we recurse on the left and right halves, both halves are required to each produce at least one Edit result.

Rather than doing:

  EditList r = new EditList();
  r.addAll(diff(... before half ...));
  r.addAll(diff(... after half ...));
  return r;

And having this nasty continuous recopying of data from one result list to another as we pop back up the call stack, we insert the edits in-place into the diff instance.  That way the list isn't copied on each recursive invocation.

I can't say I've optimized the code as well as we can do yet, but I was trying to avoid memory allocations and excessive copying inside the main loop.