def get_overlaps(first_intervals, second_intervals):
    """
    >>> get_overlaps([(1, 2), (3, 4), (8, 9)], [(1, 4), (7, 8.5)])
    [(1, 2), (3, 4), (8, 8.5)]
    >>> get_overlaps([(1, 4), (7, 8.5)], [(1, 2), (3, 4), (8, 9)])
    [(1, 2), (3, 4), (8, 8.5)]
    >>> get_overlaps([(1, 8), (9, 10)], [(2, 3), (5, 6), (7, 9.5)])
    [(2, 3), (5, 6), (7, 8), (9, 9.5)]
    >>> get_overlaps([(2, 3), (5, 6), (7, 9.5)], [(1, 8), (9, 10)])
    [(2, 3), (5, 6), (7, 8), (9, 9.5)]
    >>> get_overlaps([(1, 10)], [(0, 5)])
    [(1, 5)]
    >>> get_overlaps([(0, 5)], [(1, 10)])
    [(1, 5)]
    >>> get_overlaps([(1, 6), (7, 9)], [(5.5, 7.5)])
    [(5.5, 6), (7, 7.5)]
    >>> get_overlaps([(5.5, 7.5)], [(1, 6), (7, 9)])
    [(5.5, 6), (7, 7.5)]
    """

    overlaps = []
    for first_interval in first_intervals:
        # Find the index of the first interval in the second list starting after this interval ends.
        # We do not need to search beyond this interval.
        end_index = None
        for index, second_interval in enumerate(second_intervals):
            if second_interval[0] >= first_interval[1]:
                end_index = index
                break

        # Go through all of these intervals and compute the overlaps.
        for second_interval in second_intervals[:end_index]:
            if second_interval[1] > first_interval[0]:
                uncovered_region = (max(first_interval[0], second_interval[0]), min(first_interval[1], second_interval[1]))
                overlaps.append(uncovered_region)

    return overlaps