package com.interview.misc; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * Date 03/21/2016 * @author Tushar Roy * * Insert internal into sorted intervals and merge them. * * Time complexity O(n) * * https://leetcode.com/problems/insert-interval/ */ public class InsertInterval { public static class Interval { int start; int end; @Override public String toString() { return "Interval{" + "start=" + start + ", end=" + end + '}'; } Interval(int s, int e) { start = s; end = e; } } public List<Interval> insert(List<Interval> intervals, Interval newInterval) { List<Interval> result = new ArrayList<>(); boolean alreadyAdded = false; for (int i = 0; i < intervals.size(); i++) { if ((intervals.get(i).end < newInterval.start)) { result.add(intervals.get(i)); } else if (intervals.get(i).start > newInterval.end) { if (!alreadyAdded) { result.add(newInterval); alreadyAdded = true; } result.add(intervals.get(i)); } else { newInterval.start = Math.min(newInterval.start, intervals.get(i).start); newInterval.end = Math.max(newInterval.end, intervals.get(i).end); if (!alreadyAdded) { result.add(newInterval); alreadyAdded = true; } } } if (!alreadyAdded) { result.add(newInterval); } return result; } public static void main(String args[]) { Interval i1 = new Interval(1,3); Interval i2 = new Interval(6,7); Interval i3 = new Interval(9,10); Interval i4 = new Interval(11,12); List<Interval> input = new ArrayList<>(); input.add(i1); input.add(i2); input.add(i3); input.add(i4); InsertInterval ii = new InsertInterval(); System.out.println(ii.insert(input, new Interval(13, 15))); } }