Sort by start time.
Scan from left to right keep a start and end for merged interval.
Update the end time (make sure it's larger) until no intersecting intervals.
Code
public List<Interval> merge(List<Interval> intervals) {
List<Interval> results = new ArrayList<>();
// edge check
if (intervals == null || intervals.size() == 0) {
return results;
}
// sort by start time
Collections.sort(intervals, (Interval i1, Interval i2) -> i1.start - i2.start);
// scan sorted intervals
int mergeStartTime = intervals.get(0).start;
int mergeEndTime = intervals.get(0).end;
for (Interval intv : intervals) {
if (intv.start <= mergeEndTime) {
mergeEndTime = Math.max(mergeEndTime, intv.end);
} else {
results.add(new Interval(mergeStartTime, mergeEndTime));
mergeStartTime = intv.start;
mergeEndTime = intv.end;
}
}
results.add(new Interval(mergeStartTime, mergeEndTime));
return results;
}