思路:

  1. 构造一个比较器,用于对原始的区间数组 intervals 进行排序。区间类Interval 之间进行比较,start 小排前面,大排后面,相等的话,比较 end。end 小排前面,大排后面,相等返回 0。
  2. 成功构造一个比较器后,我们就对原始的区间数组 intervals 进行排序。
  3. 排完序后,我们取出数组中的第一个区间作为原始区间,然后遍历数组中剩下的区间,比较过程如下:
  4. 如果当前区间的 end 小于从数组中取出区间的 start 值时,意味着无法再进行区间的合并。将当前区间添加到结果集中,同时,当前区间更新为此时从数组中取出的那个区间
  5. 如果当前区间的 end 大于等于从数组中取出区间的 start 值时,意味着可以进行区间合并,此时又分为两种情况
  6. 如果当前区间的 end 大于等于从数组中取出区间的 end 值时,不做任何处理。(因为当前区间已经包含了取出的区间)
  7. 如果当前区间的 end 小于从数组中取出区间的 end 值时,更新当前区间的 end 值即可。
  8. 最终,我们得到了系统要的结果。
import java.util.*;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    
    // 区间比较器
    public class ComparaInterval implements Comparator<Interval> {
        @Override
        public int compare(Interval interval1, Interval interval2) {
            if (interval1.start < interval2.start) {
                return -1;
            }
            else if (interval1.start > interval2.start) {
                return 1;
            }
            else {
                if (interval1.end < interval2.end) {
                    return -1;
                }
                else if (interval1.end > interval2.end) {
                    return 1;
                }
                else {
                    return 0;
                }
            }
        }
    }
    
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        
        if (intervals.size() <  2) {
            return intervals;
        }
        
        intervals.sort(new ComparaInterval());
        ArrayList<Interval> arrayList = new ArrayList<>();
        Interval interval = intervals.get(0);
        intervals.remove(0);
        for (Interval tmpInterval : intervals) {
            if (tmpInterval.start > interval.end) {
                arrayList.add(interval);
                interval = tmpInterval;
            }
            else {
                if (interval.end >= tmpInterval.end) {
                    
                }
                else {
                    interval.end = tmpInterval.end;
                }
            }
        }
        arrayList.add(interval);
        arrayList.sort(new ComparaInterval());
        return arrayList;
    }
}