```python
def merge_intervals(intervals):
    if not intervals:
        return []
    
    for start, end in intervals:
        if start > end:
            raise ValueError("start > end")
    
    sorted_intervals = sorted(intervals, key=lambda x: x[0])
    
    merged = []
    current_start, current_end = sorted_intervals[0]
    
    for start, end in sorted_intervals[1:]:
        if start <= current_end:
            current_end = max(current_end, end)
        else:
            merged.append([current_start, current_end])
            current_start, current_end = start, end
    
    merged.append([current_start, current_end])
    
    return merged
```