问题描述
给定一个包含多个区间的列表,要求将将重叠的区间进行合并,返回合并后的区间列表。题目链接:**点我**
样例输入输出
输入:[[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:[1,3] 这个区间,结束的位置 3 在区间 [2, 6] 之间,因此可以把 [1, 3] 和 [2, 6] 两个区间合并成一个区间 [1, 6]
输入:[[1,4],[4,5]]
输出:[[1,5]]
解释:[1,4] 这个区间,结束的位置 4 在区间 [4, 5] 开始处,因此可以把 [1, 4] 和 [4, 5] 两个区间合并成一个区间 [1, 5]
问题解法
如果将所有的区间在直线上画出来进行表示,那么进行区间合并就会很直观,也很简单。按照此思路,可以先对列表中的所有区间进行排序,区间起始数小的排在前面。然后依次遍历排序后的区间列表,对相邻的区间进行合并,合并的原则是前一个区间的结束数字在后一个区间之间(包含区间的起始位置),则更新区间的结束位置。具体实现代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | 
 
 
 
 
 
 
 
  class Solution  {     private void sort(List<Interval> intervals)     {         intervals.sort((Interval a, Interval b) -> {             if (a.start < b.start)             {                 return -1;             }                          if (a.start > b.start)             {                 return 1;             }                          return a.end - b.end;         });     }          public List<Interval> merge(List<Interval> intervals)      {         if (intervals == null || intervals.size() < 1)         {             return new ArrayList<>();         }                  sort(intervals);         List<Interval> result = new LinkedList<>();         Interval current = intervals.get(0);         result.add(current);         for (Interval interval : intervals)         {             if (current.end < interval.start)             {                 current = interval;                 result.add(current);                 continue;             }                          if (current.end > interval.end)             {                 continue;             }                          current.end = interval.end;         }         return result;     } }
 
  |