```python
from typing import List

def span_merge(spans: List[List[int]]) -> List[List[int]]:
    if not spans:
        return []
    
    # Sort spans by their start time
    spans.sort(key=lambda x: x[0])
    
    merged = [spans[0]]
    
    for current_span in spans[1:]:
        last_merged_span = merged[-1]
        
        if current_span[0] <= last_merged_span[1]:
            # Merge overlapping or touching spans
            merged[-1][                [                    max(last_merged_span[1], current_span[1]),
                ]
        else:
            # Add non but non touching spans as they are
            merged.append(current_span)
    
    return merged
```
