/**
* struct Interval {
*  int start;
*  int end;
*  Interval(int s, int e) : start(start), end(e) {}
* };
*/
#include <functional>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param intervals Interval类vector
     * @return Interval类vector
     */
    vector<Interval> merge(vector<Interval>& intervals) {
        std::sort(intervals.begin(), intervals.end(), [](Interval & lhs,
        Interval & rhs) {
            return lhs.start < rhs.start;
        });

        vector<Interval> ans;

        int i = 0, j = 1, n = intervals.size();
        while (i < n) {
            int start = intervals[i].start, end = intervals[i].end;\

            while (j < n && intervals[j].start <= end) {
                end = std::max(end, intervals[j].end);
                ++j;
            }

            ans.emplace_back(start, end);
            i = j;
        }

        return ans;
    }
};