public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        // 根据左边界升序排列,左边界相等时根据右边界升序排列
        Collections.sort(intervals, (a, b) -> {
            if (a.start == b.start) return a.end - b.end;
            else return a.start - b.start;
        });
        int size = intervals.size();
        ArrayList<Interval> res = new ArrayList<>();
        for (int i = 1; i <= size; i++) {
            int start = intervals.get(i-1).start;
            int maxEnd = intervals.get(i-1).end;
            // 当合并区间左边界>=i的左边界时,更新合并区间的左边界,否则退出循环
            while (i<size && maxEnd >= intervals.get(i).start) {
                maxEnd = Math.max(maxEnd, intervals.get(i).end);
                i++;
            }
            // 登记区间
            res.add(new Interval(start, maxEnd));
        }
        return res;
    }