Adding punctuation to US and European patent numbers
Here is a solution using a generator, which gives you linear time. Your current solution is not linear, because list.insert is already \$\mathcal{O}(n)\$.

def interweave(x, y):
    """
    Given an iterable `x` and an iterable `y` of indices and items, 
    yield from `x`, but interweave the items from `y` at the given indices.
    """
    y = iter(y)
    next_i, next_y = next(y, (-1, ""))
    for i, next_x in enumerate(x):
        if i == next_i:
            yield next_y
            next_i, next_y = next(y, (-1, ""))  # default value for when y is exhausted
        yield next_x

def punctuate(text, punctuations):
    return "".join(interweave(text, punctuations))


It passes all the given testcases:

In [98]: punctuate('US 8012999 B2', [(4, ','), (7, ',')])
Out[98]: 'US 8,012,999 B2'

In [99]: punctuate('US 20170107206 A1', [(7, '/')])
Out[99]: 'US 2017/0107206 A1'

In [100]: punctuate('US 09700674', [(5, '/'), (8, ',')])
Out[100]: 'US 09/700,674'

In [101]: punctuate('EP 2795605 B1', [(4, ' '), (7, ' ')])
Out[101]: 'EP 2 795 605 B1'