问题原始链接 https://leetcode.com/problems/merge-intervals
给定一个区间集合,合并所有有重叠的区间。
例如,给定 [1,3],[2,6],[8,10],[15,18],返回 [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 static List<Interval> merge(List<Interval> intervals) {
List<Interval> result = new ArrayList<Interval>();
if (intervals == null || intervals.size() == 0) {
return result;
}
if (intervals.size() == 1) {
result.add(intervals.get(0));
return result;
}
Collections.sort(intervals, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Interval i1 = (Interval) o1;
Interval i2 = (Interval) o2;
if (i1.start < i2.start) {
return -1;
} else if (i1.start > i2.start) {
return 1;
} else {
if (i1.end < i2.end) {
return -1;
} else if (i1.end > i2.end) {
return 1;
}
}
return 0;
}
});
Interval preInterval = intervals.get(0);
for (int i = 1; i < intervals.size(); i++) {
Interval interval = intervals.get(i);
if (interval.start <= preInterval.end) {
preInterval.end = Math.max(preInterval.end, interval.end);
} else {
result.add(preInterval);
preInterval = interval;
}
}
result.add(preInterval);
return result;
}
}