```python
def span_merge(spans: list) -> list:
    # Sort the spans by start
    spans.sort(key=lambda x: x.start)
    
    merged_spans = []
    current_span = None
    
    for span in spans:
        if current_span is None:
            current_span = span
        else:
            # Check if the current span overlaps with the next span
            if current_span.end > span.start:
                # Merge the current span with the next span
                current_span.end = max(current_span.end, span.end)
            else:
                # If they don't overlap, add the current span to the merged list
                merged_spans.append(current_span)
                current_span = span
    
    # Add the last remaining span if there's one
    if current_span is not None:
        merged_spans.append(current_span)
    
    return merged_spans
```