def merge_intervals(intervals): # If the list is empty, return None if not intervals: return None result = [] # Adding the first interval from the input list (v) to the output list (result) result.append([intervals[0][0], intervals[0][1]]) for i in range(1, len(intervals)): # Last interval present in the output list last_added_interval = result[len(result) - 1] # Variables to store the start and end times of the current interval cur_start = intervals[i][0] cur_end = intervals[i][1] print("\t\t\tCurrent input interval:", "[", cur_start, ",", cur_end, "]") # The end time of the last interval present in the output list prev_end = last_added_interval[1] print("\t\t\tLast output interval:", "[", last_added_interval[0], ",", last_added_interval[1], "]") # Overlapping condition if cur_start <= prev_end: result[-1][1] = max(cur_end, prev_end) print("\t\t\tOverlapping condition true. Updating last output interval...") print("\t\t\tUpdated last output interval:", "[", last_added_interval[0], ",", last_added_interval[1], "]", "\n") # No overlapping else: print("\t\t\tOverlapping condition false. Adding input interval to output list...") result.append([cur_start, cur_end]) print("\t\t{:<4}{:<10}{:<4}{:<9}{:<4}{:<9}{:<4}{:<12}{:<5}".format( \ "|", "cur_start", "|", "cur_end", "|", "prev_end", "|", "Overlapping", "|")) print("\t\t", "-"*54) print("\t\t{:<4}{:<10}{:<4}{:<9}{:<4}{:<9}{:<4}{:<12}{:<5}".format( \ "|", cur_start, "|", cur_end, "|", prev_end, "|", bool(prev_end >= cur_start), "|")) print("\n") return result # Driver code def main(): all_intervals = [ [[1, 5], [3, 7], [4, 6]], [[1, 5], [4, 6], [6, 8], [11, 15]], [[3, 7], [6, 8], [10, 12], [11, 15]], [[1, 5]], [[1, 9], [3, 8], [4, 4]], [[1, 2], [3, 4], [8, 8]], [[1, 5], [1, 3]], [[1, 5], [6, 9]], [[0, 0], [1, 18], [1, 3]] ] for i in range(len(all_intervals)): print(i + 1, ". Intervals to merge: ", all_intervals[i], sep="") result = merge_intervals(all_intervals[i]) print(" Merged intervals:\t", result) print("-"*100) if __name__ == '__main__': main()