Merge two sorted (ascending) lists of interval and return it as a new sorted list. The new sorted list should be made by splicing together the intervals of the two lists and sorted in ascending order.
Example
Example1
Input: list1 = [(1,2),(3,4)] and list2 = [(2,3),(5,6)]
Output: [(1,4),(5,6)]
Explanation:
(1,2),(2,3),(3,4) --> (1,4)
(5,6) --> (5,6)
Example2
Input: list1 = [(1,2),(3,4)] and list2 = [(4,5),(6,7)]
Output: [(1,2),(3,5),(6,7)]
Explanation:
(1,2) --> (1,2)
(3,4),(4,5) --> (3,5)
(6,7) --> (6,7)
Notice
- The intervals in the given list do not overlap.
- The intervals in different lists may overlap.
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 list1: one of the given list
* @param list2: another list
* @return: the new sorted list of interval
*/
public List<Interval> mergeTwoInterval(List<Interval> list1, List<Interval> list2) {
// write your code here
List<Interval> ans = new ArrayList<>();
int i = 0;
int j = 0;
Interval prev = null;
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;
i++;
} else {
curr = v2;
j++;
}
prev = merge(ans, prev, curr);
}
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) {
return curr;
}
if (prev.end < curr.start) {
ans.add(prev);
prev = curr;
return prev;
}
prev.end = Math.max(prev.end, curr.end);
return prev;
}
}
Update on 4/23/20:
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param list1: one of the given list
* @param list2: another list
* @return: the new sorted list of interval
*/
public List<Interval> mergeTwoInterval(List<Interval> list1, List<Interval> list2) {
// write your code here
List<Interval> ans = new ArrayList<>();
if (list1 == null || list1.size() == 0) {
return list2;
}
if (list2 == null || list2.size() == 0) {
return list1;
}
Interval prev = null;
int i = 0;
int j = 0;
while (i < list1.size() || j < list2.size()) {
if (i == list1.size()) {
prev = merge(prev, list2.get(j), ans);
j++;
} else if (j == list2.size()) {
prev = merge(prev, list1.get(i), ans);
i++;
} else if (list1.get(i).start < list2.get(j).start) {
prev = merge(prev, list1.get(i), ans);
i++;
} else {
prev = merge(prev, list2.get(j), ans);
j++;
}
}
ans.add(prev);
return ans;
}
private Interval merge(Interval prev, Interval curr, List<Interval> ans) {
if (prev == null) {
prev = curr;
} else if (!isOverlapped(prev, curr)) {
ans.add(new Interval(prev.start, prev.end));
prev = curr;
} else {
prev.start = Math.min(prev.start, curr.start);
prev.end = Math.max(prev.end, curr.end);
}
return prev;
}
private boolean isOverlapped(Interval a, Interval b) {
return a.end >= b.start;
}
}
No comments:
Post a Comment