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]
.
* 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) {
if(intervals==null||intervals.size()<=1)
return intervals;
intervalQuickSort(intervals,0,intervals.size()-1);
for(int i=0;i<intervals.size()-1;)
if(intervalMerge(intervals.get(i), intervals.get(i+1)))
intervals.remove(i+1);
else
i++;
return intervals;
}
private boolean intervalMerge(Interval a,Interval b)
{
if(Math.min(a.end, b.end)-Math.max(a.start, b.start)>=0)
{
a.start = Math.min(a.start, b.start);
a.end = Math.max(a.end, b.end);
return true;
}
return false;
}
private void intervalQuickSort(List<Interval> intervals,int p,int q)
{
if(p>=q)
return;
int b = p,e = q;
while(b<e)
{
while(e>b&&intervals.get(e).start>=intervals.get(b).start)
e--;
intervalSwap(intervals.get(b),intervals.get(e));
while(e>b&&intervals.get(b).start<=intervals.get(e).start)
b++;
intervalSwap(intervals.get(b),intervals.get(e));
}
intervalQuickSort(intervals, p, b-1);
intervalQuickSort(intervals, b+1, q);
}
private void intervalSwap(Interval a,Interval b)
{
int tmp;
tmp = b.start;
b.start = a.start;
a.start = tmp;
tmp = b.end;
b.end = a.end;
a.end = tmp;
}
}