def merge_intervals(intervals):
if not intervals:
return []
sorted_intervals = sorted(intervals, key=lambda x: x[0])
merged = [list(sorted_intervals[0])] # copy to avoid mutation
for start, end in sorted_intervals[1:]:
last_start, last_end = merged[-1]
if start <= last_end: # overlap or touch
merged[-1][1] = max(last_end, end)
else:
merged.append([start, end])
return merged