Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
Difficulty: Hard
Solution:
The key in this problem is to use sort with Comparator. Define a comparator and the rest should be very easy.
/**
* 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 List<Interval> merge(List<Interval> intervals) {
List<Interval> result = new ArrayList<Interval>();
if(intervals == null||intervals.size() == 0)
return result;
if(intervals.size() == 1)
return intervals;
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval i1, Interval i2){
if(i1.start!=i2.start)
return i1.start-i2.start;
else
return i1.end-i2.end;
}
});
int start = 0, end = 0, i = 0;
while(i < intervals.size()){
Interval temp = intervals.get(i);
if(i == 0){
start = temp.start;
end = temp.end;
}
else{
if(end < temp.start){
Interval ans = new Interval(start, end);
result.add(ans);
start = temp.start;
end = temp.end;
if(i == intervals.size() - 1){
result.add(new Interval(start, end));
}
}
else{
end = Math.max(temp.end, end);
if(i == intervals.size() - 1){
result.add(new Interval(start, end));
}
}
}
i++;
}
return result;
}
}