I propose this solution:
def merge_sets(set_list):
    if len(set_list) == 0:
        # short circuit to avoid errors
        return []
    current_set = set_list[0]
    new_set_list = [current_set, ]
    for s in set_list[1:]:          # iterate from the second element
        if len(current_set.intersection(s)) > 0:
            current_set.update(s)
        else:
            current_set = set(s)    # copy
            new_set_list.append(current_set)
    return new_set_list
The test cases this works for:
test_cases = [
    {
        'input': [{1, 3}, {2, 3}, {4, 5}, {6, 5}, {7, 5}, {8, 9}],
        'output': [{1, 2, 3}, {4, 5, 6, 7}, {8, 9}],
    },
    {
        'input': [{1, 2}, {2, 3}, {3, 4}],
        'output': [{1, 2, 3, 4}, ],
    },
    {
        'input': [{1}, {2}, {1, 2}],
        'output': [{1}, {1, 2}],
    },
    {
        'input': [{1, 2}, {3, 4}, {2, 3}],
        'output': [{1, 2}, {2, 3, 4}],
    },
]
for case in test_cases:
    print('input   ', case['input'])
    print('expected', case['output'])
    new_output = merge_sets(case['input'])
    print('real    ', new_output)
    assert new_output == case['output']
Does this work for you?