def diff(list1, list2):
    """
    Takes two lists of hits.
    A hit can be anything with .first_column and .last_column on it.
    list2 must be sorted.
    Returns the groups that are in list1 but do not overlap any groups in list2.
    """
    if not list2:
        return list1
    
    # We will recursively split list2
    mid_index = len(list2) // 2
    mid_hit = list2[mid_index]
    
    before_mid_hit = []
    after_mid_hit = []
    for hit in list1:
        if hit.last_column < mid_hit.first_column:
            before_mid_hit.append(hit)
        if mid_hit.last_column < hit.first_column:
            after_mid_hit.append(hit)

    return diff(before_mid_hit, list2[:mid_index]) + diff(after_mid_hit, list2[mid_index+1:])