code: public RangeTombstoneList diff(RangeTombstoneList superset)
      {
          if (isEmpty())
              return superset;
  
          RangeTombstoneList diff = null;
  
          int j = 0; // index to iterate through our own list
          for (int i = 0; i < superset.size; i++)
          {
              // we can assume that this list is a subset of the superset list
              while (j < size && comparator.compare(starts[j], superset.starts[i]) < 0)
                  j++;
  
              if (j >= size)
              {
                  // we're at the end of our own list, add the remainder of the superset to the diff
                  if (i < superset.size)
                  {
                      if (diff == null)
                          diff = new RangeTombstoneList(comparator, superset.size - i);
  
                      for(int k = i; k < superset.size; k++)
                          diff.add(superset.starts[k], superset.ends[k], superset.markedAts[k], superset.delTimes[k]);
                  }
                  return diff;
              }
  
              // we don't care about local deletion time here, because it doesn't matter for read repair
              if (!starts[j].equals(superset.starts[i])
                  || !ends[j].equals(superset.ends[i])
                  || markedAts[j] != superset.markedAts[i])
              {
                  if (diff == null)
                      diff = new RangeTombstoneList(comparator, Math.min(8, superset.size - i));
                  diff.add(superset.starts[i], superset.ends[i], superset.markedAts[i], superset.delTimes[i]);
              }
          }
  
          return diff;
      }
docs: Evaluates a diff between superset (known to be all merged tombstones) and this list for read repair
  
  @return null if there is no difference