Merge two sorted linear graphs
Use yield instead of building a list. There is no need for an explicit list.
At start of method or input with [] for cleaner None checks.
Move interpolation into a function. This avoid repeated code.
Move all the casework into the interpolation function.


def graph_value(L, i, x):
    if x == L[i][0]: return L[i][1]
    if i == 0: return 0
    m = (L[i][1] - L[i - 1][1]) / (L[i][0] - L[i - 1][0])
    return m * (x - L[i - 1][0]) + L[i - 1][1]

def graph_addition(A, B):
    A = A or []
    B = B or []
    i = j = 0
    while i &lt; len(A) and j &lt; len(B):
        x = min(A[i][0], B[j][0])
        y = graph_value(A, i, x) + graph_value(B, j, x)
        i += (x == A[i][0])
        j += (x == B[j][0])
        yield (x,y)
    yield from A[i:]
    yield from B[j:]


Exercise to the reader: write a version that takes in two arbitrary iterables and performs the same functionality.