1. 首先对区间首端点从小到大进行排序。然后如果开始端点相同,end按照降序排列
  2. 脑子中画出这些排序的区间,由底到高画。
  3. 一共就分为3中情况,最后一种覆盖又分为起始点不同的覆盖,以及起始点相同的覆盖。
  4. 对于延长区间只有一种情况,就是第二段的end比最后一段end长,这时候直接更新已有end就行。
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {

        sort(intervals.begin(),intervals.end(),[](Interval a, Interval b){
            if(a.start==b.start){
                return a.end > b.end;
            }else{
                return a.start< b.start;
            }
        });

        vector<Interval> res;

        for(int i =0; i< intervals.size();i++){
            if(res.empty() || res.back().end< intervals[i].start){//为空或者是end 大于start,不可能相交
                res.push_back(intervals[i]);//放入
            }else{
                if(res.back().end< intervals[i].end){
                    res.back().end = intervals[i].end;//满足合并条件,更新end位置
                }
            }
        }


        return res;



    }
};