Сначала попробуйте сами: на собеседовании подсказки не будет.
Сортировка по началу гарантирует, что каждый следующий интервал может пересекаться только с последним собранным. Держим результат как стек: если новый интервал начинается не позже конца последнего, расширяем конец через max, иначе кладём новый.
start <= end (нестрогое) сливает соприкасающиеся интервалы. max нужен, потому что новый интервал может целиком лежать внутри предыдущего.
def merge(intervals):
result = []
for start, end in sorted(intervals):
if result and start <= result[-1][1]:
result[-1] = (result[-1][0], max(result[-1][1], end))
else:
result.append((start, end))
return result