Merge K sorted interval lists into one sorted interval list. You need to merge overlapping intervals too.
Example
Example1
Input: [
[(1,3),(4,7),(6,8)],
[(1,2),(9,10)]
]
Output: [(1,3),(4,8),(9,10)]
Example2
Input: [
[(1,2),(5,6)],
[(3,4),(7,8)]
]
Output: [(1,2),(3,4),(5,6),(7,8)]
Code (Java)/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param intervals: the given k sorted interval lists
* @return: the new sorted interval list
*/
public List<Interval> mergeKSortedIntervalLists(List<List<Interval>> intervals) {
// write your code here
List<Interval> ans = new ArrayList<>();
if (intervals == null || intervals.size() == 0) {
return ans;
}
return mergeHelper(0, intervals.size() - 1, intervals);
}
private List<Interval> mergeHelper(int start, int end, List<List<Interval>> intervals) {
if (start == end) {
return intervals.get(start);
}
int mid = start + (end - start) / 2;
List<Interval> left = mergeHelper(start, mid, intervals);
List<Interval> right = mergeHelper(mid + 1, end, intervals);
return mergeTwoLists(left, right);
}
private List<Interval> mergeTwoLists(List<Interval> list1, List<Interval> list2) {
int i = 0;
int j = 0;
Interval prev = null;
List<Interval> ans = new ArrayList<>();
while (i < list1.size() && j < list2.size()) {
Interval curr = null;
Interval v1 = list1.get(i);
Interval v2 = list2.get(j);
if (v1.start < v2.start) {
curr = v1;
prev = merge(ans, prev, curr);
i++;
} else {
curr = v2;
prev = merge(ans, prev, curr);
j++;
}
}
while (i < list1.size()) {
Interval curr = list1.get(i);
prev = merge(ans, prev, curr);
i++;
}
while (j < list2.size()) {
Interval curr = list2.get(j);
prev = merge(ans, prev, curr);
j++;
}
if (prev != null) {
ans.add(prev);
}
return ans;
}
private Interval merge(List<Interval> ans, Interval prev, Interval curr) {
if (prev == null) {
prev = curr;
return prev;
}
if (prev.end < curr.start) {
ans.add(prev);
prev = curr;
}
prev.end = Math.max(prev.end, curr.end);
return prev;
}
}
Modified Solution :
ReplyDeleteimport java.util.*;
class Interval
{
int start,end;
Interval(int start, int end)
{
this.start=start;
this.end=end;
}
public String toString()
{
return this.start + " " + this.end ;
}
}
class SortbyEnd implements Comparator
{
// Used for sorting in ascending order of
// roll number
public int compare(Interval a, Interval b)
{
return a.end - b.end;
}
}
class MyClass
{
public static void main(String args[]){
List list = new ArrayList();
//list.add(new Interval(1,2));list.add(new Interval(4,7));list.add(new Interval(1,3));list.add(new Interval(6,8));list.add(new Interval(9,10));
list.add(new Interval(1,2));list.add(new Interval(5,6));list.add(new Interval(3,4));list.add(new Interval(7,8));
Collections.sort(list, new SortbyEnd());
System.out.println(list);
test(list);
}
static void test(List list)
{
int a=0,b=0;
List ans = new ArrayList();
for(int i=0;i list.get(i+1).start)
{
a=list.get(i).start;
b=list.get(i+1).end;
ans.add(new Interval(a,b));
i+=1;
}
else{
ans.add(new Interval(list.get(i).start,list.get(i).end));
}
}
System.out.println(ans);
}
}