Время выполнения каждого из этих циклов равно O (n), поскольку вы посещаете каждый из n элементов постоянное число раз (один раз в первом случае, два раза во втором) и выполняете самое большее постоянный объем работы над каждым элементом.
Нотация Big-O измеряет асимптотическое время выполнения фрагмента кода, поэтому, говоря, что оба фрагмента кода выполняются за время O (n), не означает, что для их завершения требуется одинаковое количество времени. Вы должны измерить это на вашей конкретной системе с вашей конкретной настройкой, чтобы увидеть, что быстрее. Я подозреваю, что первая версия будет быстрее, так как она делает только один проход по списку.
При этом я бы с осторожностью попытался оптимизировать код, подобный этому. Сначала стремитесь к ясности, и если вы обнаружите, что это узкое место в производительности, то подумайте о его пересмотре. Скорее всего, если это замедляет всю вашу программу, переключение на другое представление данных, такое как сохранение всего в хэш-таблице или сбалансированное BST, будет быстрее, потому что ожидаемая стоимость проверки наличия элемента составляет O (1 ) или O (log n), соответственно, для этих типов контейнеров.