def combine_ranges(ranges):
    # Sort ranges based on the start of each range
    ranges.sort(key=lambda x: x[0])
    
    # Initialize a list to store the merged ranges
    merged = []
    
    for range in ranges:
        # If merged list is empty or the current range does not overlap with the last range
        if not merged or merged[-1][1] < range[0]:
            merged.append(range)
        else:
            # There is overlap, so merge the current range with the last range
            merged[-1][1] = max(merged[-1][1], range[1])
    
    return merged

# Test cases
ranges1 = [[1, 3], [2, 6], [8, 10], [15, 18]]
ranges2 = [[1, 4], [4, 5]]

print(combine_ranges(ranges1))  # Output: [[1, 6], [8, 10], [15, 18]]
print(combine_ranges(ranges2))  # Output: [[1, 5]]
