protected void mergeNextSmallSublists() {
    if (smallSublistCount >= 2) {
      CircularListInternal<T> small2 = sublists.remove(--smallSublistCount);
      CircularListInternal<T> small1 = sublists.get(--smallSublistCount);
      sublists.set(smallSublistCount,
                   merge(small1,
                         small2,
                         new CircularListInternal<T>(small1.capacity()
                             + small2.capacity())));
      if (sublists.size() <= (sublists.capacity() >>> 2)) {
        sublists = copyTo(sublists,
                          new FixedListInternal<CircularListInternal<T>>(
                              sublists.capacity() >>> 1));
      }
      if (size > 0) {
        headSublistIndex = sublists.getHead().isEmpty() ? 1 : 0;
        tailSublistIndex = sublists.getTail().isEmpty() ? sublists.size() - 2
            : sublists.size() - 1;
      } else {
        headSublistIndex = tailSublistIndex = 0;
      }
      if (headSublistIndex == tailSublistIndex) {
        freeCapacityHead = calculateFreeCapacityHead();
      }
    } else if (smallSublistCount == 1) {
      CircularListInternal<T> small = sublists.get(--smallSublistCount);
      sublists.set(smallSublistCount,
                   copyTo(small, new CircularListInternal<T>(
                       small.capacity() << 1)));
      int smallSublistSize = (1 << smallSublistSizeExp);
      capacity += smallSublistSize;
      freeCapacityHead += smallSublistSize;
    }
  }