class Solution {
    // 按照第数组中的第一个元素排序,排序之后
    // 后一个数组的左端点如果小于前一个数组的右端点则需要合并
    // 两种情况:1.后一个数组的左端点小于前一个数组的右端点,则直接合并前一个数组
    // 2.后一个数组的左端点大于于前一个数组的右端点,则取前一个数组的左端点和后一个数组的右端点
    // 由于合并之后的元素个数我们并不知道,所以一开始要用一个list存储结果
    public int[][] merge(int[][] intervals) {
       int n = intervals.length; // 列已知为2
       Arrays.sort(intervals, (a,b) -> (a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]));
       List<int[]> merge = new ArrayList<>();
       for (int i = 0; i < n; i++) { // intevlas[i][1]与merge中最后一个数组的[1]进行比较
            if (merge.isEmpty() || intervals[i][0] > merge.get(merge.size() - 1)[1]) {
                merge.add(intervals[i]);
            } else {
                merge.get(merge.size() - 1)[1] = Math.max(merge.get(merge.size() - 1)[1], intervals[i][1]);
            }
       }
    int row = merge.size();
    int[][] res = new int[row][2];
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < 2; j++) {
            res[i][j] = merge.get(i)[j];
        }
    }
    return res;    
    }
}