986. Interval List Intersections - cocoder39/coco39_LC GitHub Wiki
986. Interval List Intersections
- when deciding which list to advance, we should compare the 2nd element in list instead of the 1st one. We are evaluating which range could have impact on the rest.
approach 1: merge
class Solution:
def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]:
i, j = 0, 0
res = []
while i < len(firstList) and j < len(secondList):
left = max(firstList[i][0], secondList[j][0])
right = min(firstList[i][1], secondList[j][1])
if left <= right:
res.append([left, right])
if firstList[i][1] <= secondList[j][1]:
i += 1
else:
j += 1
return res
approach 2: select smaller one
def merge_intervals(intervals1, intervals2):
merged_intervals = []
i, j = 0, 0
# Helper function to add an interval to the merged list
def add_interval(interval):
if not merged_intervals:
merged_intervals.append(interval)
else:
last_interval = merged_intervals[-1]
if interval[0] <= last_interval[1]: # Overlapping intervals
merged_intervals[-1] = [last_interval[0], max(last_interval[1], interval[1])]
else:
merged_intervals.append(interval)
# Step 2: Traverse both lists and merge intervals
while i < len(intervals1) and j < len(intervals2):
if intervals1[i][0] < intervals2[j][0]:
add_interval(intervals1[i])
i += 1
else:
add_interval(intervals2[j])
j += 1
# Append remaining intervals from intervals1
while i < len(intervals1):
add_interval(intervals1[i])
i += 1
# Append remaining intervals from intervals2
while j < len(intervals2):
add_interval(intervals2[j])
j += 1
return merged_intervals
followup: merge k interval list
- option 1: use pq to pick next one to add
- option 2: divide and conquer - slit to 2 halves, and merge each of them, then merge the final 2 lists