LeetCode | 区间合并

题目

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题思路

  • 给出的区间集合不一定有序,所以需要先进行排序
  • 排序后建立新的链表,并尾插入原链表的第一个元素
  • 从原链表的第二个元素进行遍历,并与新链表的最后一个元素进行比较,如果有重合的区间,则更新新链表的最后一个元素,否则,直接插入遍历到的原链表的元素

代码实现

package MySolution;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class Interval {
    int start;
    int end;
    Interval() { start = 0; end = 0; }
    Interval(int s, int e) { start = s; end = e; }
}

class Solution {
    public List<Interval> merge(List<Interval> intervals) {
// 注意此处比较器接口的写法 Collections.sort(intervals,
new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { if(o1.start<o2.start) return -1; else if(o1.start<o2.start) return 1; else return 0; } }); LinkedList<Interval> mergediIntervals=new LinkedList<Interval>();
     // 对空表的处理(鲁棒性)
if(intervals.isEmpty()) return mergediIntervals;
mergediIntervals.add(intervals.get(
0)); for(int i=1;i<intervals.size();i++){ if(mergediIntervals.getLast().end<intervals.get(i).start) mergediIntervals.addLast(intervals.get(i)); else mergediIntervals.getLast().end=intervals.get(i).start; } return mergediIntervals; } }

代码注意事项

  • 先考虑对特殊情况的处理(List空)
  • 自定义排序模板:
    Collections.sort(list, new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            // TODO Auto-generated method stub
            return 0;
        }
    });
原文地址:https://www.cnblogs.com/ustctp/p/9046868.html