If there are no multiple positions for each `insertelement` we can do something like: i = 0; Insert[origlist, "mark", insertpositions] /. "mark" :> (++i; insertvalues[[i]]) if, there are it can be exteded easily, by making duplicates in `insertelements` or to make different `"marks"` for them.