Merge Intervals

Example 1:

Input: intervals = [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6]. Example 2:

Input: intervals = [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        result_list = []

        def sort_intervals(e):
            return e[0]

        intervals.sort(key=sort_intervals)

        def test_overlap(left, test_arr):
            return left[0] <= test_arr[0] <= left[1] or left[0] <= test_arr[1] <= left[1]

        def change_overlap(index, left, right):
            # fix the correct overlap
            small_left = min(left[0], right[0])
            large_right = max(left[1], right[1])
            result_list[index] = [small_left, large_right]

        for i, right_arr in enumerate(intervals):
            if i == 0:
                result_list.append(right_arr)
            else:
                last_result = len(result_list) - 1
                if test_overlap(result_list[last_result], right_arr):
                    change_overlap(last_result, result_list[last_result], right_arr)
                else:
                    result_list.append(right_arr)

        return result_list


sol = Solution()

test_set = [
    {
        "no": "first",
        "interval": [[1, 3], [2, 6], [8, 10], [15, 18]],
        "answer": [[1, 6], [8, 10], [15, 18]]
    },
    {
        "no": "second",
        "interval": [[1, 4], [4, 5]],
        "answer": [[1, 5]]
    },
    {
        "no": "third",
        "interval": [[1, 4], [0, 4]],
        "answer": [[0, 4]]
    },
    {
        "no": "fourth",
        "interval": [[1, 4], [0, 5]],
        "answer": [[0, 5]]
    },
    {
        "no": "fifth",
        "interval": [[1, 4], [0, 2], [3, 5]],
        "answer": [[0, 5]]
    },
    {
        "no": "sixth",
        "sorted": [[1, 3], [2, 6], [8, 10], [15, 18]],
        "interval": [[1, 3], [2, 6], [8, 10], [15, 18]],
        "answer": [[1, 6], [8, 10], [15, 18]]
    },
    {
        "no": "seventh",
        "interval": [[2, 3], [4, 5], [6, 7], [8, 9], [1, 10]],
        "answer": [[1, 10]]
    },
    {
        "no": "eighth",
        "interval": [[1,3]],
        "answer": [[1,3]]
    },
    {
        "no": "nine",
        "interval": [[1, 4], [5, 6]],
        "answer": [[1, 4], [5, 6]]
    },
    {
        "no": "ten",
        "sorted": [[1, 3], [2, 3], [2, 2], [2, 2], [3, 3], [4, 6], [5, 7]],
        "interval": [[2, 3], [2, 2], [3, 3], [1, 3], [5, 7], [2, 2], [4, 6]],
        "answer": [[1, 3], [4, 7]]
    }
]

for test in test_set:
    result = sol.merge(test['interval'])
    if result == test['answer']:
        print(f"{test['no']} answer is right")
    else:
        print(f"{test['no']} answer is wrong, the input is {test['interval']} the result is {result}")