def combine_overlapping_ranges(ranges):
    # Step 1: Sort the ranges based on the starting point
    ranges.sort(key=lambda x: x[0])
    
    # Step 2: Initialize a list to hold the combined ranges
    combined_ranges = []
    
    for current in ranges:
        # If combined_ranges is empty or there is no overlap, add the current range
        if not combined_ranges or combined_ranges[-1][1] < current[0]:
            combined_ranges.append(current)
        else:
            # There is an overlap or they touch, so we merge the current range with the last one
            combined_ranges[-1][1] = max(combined_ranges[-1][1], current[1])
    
    return combined_ranges

# Example Cases
# Example 1
ranges1 = [[1, 3], [2, 6], [8, 10], [15, 18]]
output1 = combine_overlapping_ranges(ranges1)
print("Output for Example 1:", output1)  # Output: [[1, 6], [8, 10], [15, 18]]

# Example 2
ranges2 = [[1, 4], [4, 5]]
output2 = combine_overlapping_ranges(ranges2)
print("Output for Example 2:", output2)  # Output: [[1, 5]]

# Additional Example 3: Touching ranges
ranges3 = [[1, 2], [2, 3], [4, 5], [5, 6]]
output3 = combine_overlapping_ranges(ranges3)
print("Output for Example 3:", output3)  # Output: [[1, 3], [4, 6]]

# Additional Example 4: Completely overlapping ranges
ranges4 = [[1, 5], [2, 3], [4, 6]]
output4 = combine_overlapping_ranges(ranges4)
print("Output for Example 4:", output4)  # Output: [[1, 6]]

# Additional Example 5: No overlapping ranges
ranges5 = [[1, 2], [3, 4], [5, 6]]
output5 = combine_overlapping_ranges(ranges5)
print("Output for Example 5:", output5)  # Output: [[1, 2], [3, 4], [5, 6]]