// 输入: [[1,3],[2,6],[8,10],[15,18]]
// 输出: [[1,6],[8,10],[15,18]]
// 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
/** * 思路: * 第一步,先按照start的大小将intervals排序。 * 第二步,合并区间,先取出第一个区间,再取出紧挨着的区间,判断两个区间可以合并么, * 合并的条件是后一个区间的start要小于等于前一个区间的end,根据后一个区间的end值是否小于前一个区间的end值, * 确定合并后的区间,一直循环遍历完集合 * */ public class TTT { public static void main(String[] args) { Interval i1 = new Interval(1, 3); Interval i2 = new Interval(2, 6); Interval i3 = new Interval(8, 10); Interval i4 = new Interval(15, 18); List<Interval> intervals = new ArrayList<>(); intervals.add(i1); intervals.add(i2); intervals.add(i3); intervals.add(i4); List<Interval> res = merge(intervals); System.out.println("#####"); } public static List<Interval> merge(List<Interval> intervals) { //1.先按照start排序 Collections.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { return o1.start - o2.start; } }); List<Interval> res = new ArrayList<Interval>(); int len = intervals.size(); int pos = 0; while(pos <= len-1){ int start = intervals.get(pos).start; int end = intervals.get(pos).end; int j = pos+1; //2.下一个元素可以合并就合并,不能合并就添加到res中并且跳到下一个元素 while( j<= len-1 && intervals.get(j).start <= end){ if(end < intervals.get(j).end){ end = intervals.get(j).end; } j++; } res.add(new Interval(start,end)); pos = j; } return res; } static class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } }