Instead of allocating new chain objects, we could sort the two lists into a single linked list and return the UnresolvedDelta that is at the start of it.  Something like:

  if (a == null)
    return b;
  if (b == null)
    return a;

  UnresolvedDelta first = null;
  UnresolvedDelta last = null;

  while (a != null || b != null) {
    UnresolvedDelta n;
    if (b == null || (a != null && a.position < b.position)) {
      n = a;
      a = a.next;
    } else {
      n = b;
      b = b.next;
    }

    if (last != null) {
      last.next = n;
      last = n;
    } else {
      first = n;
      last = n;
    }
    n.next = null;

    return first;
  }

That gives us a smaller DeltaVisit object, and simplifies code elsewhere probably by not needing both "a" and "b" chains.

For most packs we're using OFS_DELTA format these days, so most delta chains will be only of the "b" variant and take the fast path above anyway.  We should see only REF_DELTA on thin packs during fixThinPack(), and they won't have OFS_DELTA dependencies so they won't typically have a "b" variant, and use the fast path above anyway.  Basically its rather rare to have both chains, so the slow path to rebuild a single linked list isn't that common.