def merge_ranges(ranges):
  # Sort the ranges by their begin value
  ranges.sort(key=lambda x: x[0])

  merged_ranges = []
  current_range = ranges[0]
  merged_ranges.append(current_range)

  for next_range in ranges[1:]:
    if next_range[0] <= current_range[1]:  # Overlap
      current_range[1] = max(current_range[1], next_range[1])
    else:  # No overlap
      current_range = next_range
      merged_ranges.append(current_range)

  return merged_ranges

# Example usage
ranges = [[1,3],[2,6], [8,10],[15,18]]
merged_ranges = merge_ranges(ranges)
print(merged_ranges) 

ranges = [[1,4],[4,5]]
merged_ranges = merge_ranges(ranges)
print(merged_ranges) 

ranges = [[7,8], [7,9]]
merged_ranges = merge_ranges(ranges)
print(merged_ranges)