def combineOverlappingRanges(ranges):  
    # Step 1: Return an empty list if the input is empty  
    if not ranges:  
        return []  

    # Step 2: Sort the ranges based on the starting point  
    ranges.sort(key=lambda x: x[0])  

    # Step 3: Initialize the merged list with the first range  
    merged = [ranges[0]]  

    # Step 4: Iterate over the remaining ranges and merge them if needed  
    for current in ranges[1:]:  
        last_merged = merged[-1]  

        # Check for overlap  
        if current[0] <= last_merged[1]:  # There is overlap  
            # Merge the ranges by updating the end of the last merged range  
            last_merged[1] = max(last_merged[1], current[1])  
        else:  
            # No overlap, add the current range to the merged list  
            merged.append(current)  

    return merged  

# Example usage:  
ranges1 = [[1, 3], [2, 6], [8, 10], [15, 18]]  
print(combineOverlappingRanges(ranges1))  # Output: [[1, 6], [8, 10], [15, 18]]  

ranges2 = [[1, 4], [4, 5]]  
print(combineOverlappingRanges(ranges2))  # Output: [[1, 5]]