```ts
function mergeIntervals(intervals: number[][]): number[][] {
    if (!intervals || intervals.length === 0) return [];

    intervals.sort((a, b) => a[0] - b[0]);

    let merged = [];
    let lastInterval = intervals[0].slice();

    for (let i = 1; i < intervals.length; i++) {
        const currentInterval = intervals[i];

        if (currentInterval[0] <= lastInterval[1]) {
            // Merge overlapping intervals
            if (currentInterval[1] > lastInterval[1]) lastInterval[1] = currentInterval[1];
        } else {
            // No overlap, start a new interval
            merged.push([...lastInterval]);
            lastInterval = currentInterval.slice();
        }
    }

    merged.push([...lastInterval]); // Add the final non-overlapping interval

    return merged;
}
```