# semantics – How do you justify making algorithm subroutines more efficient when Big-O notation only includes the dominant term?

I don’t really understand time complexity, and wanted some clarification in this hypothetical situation.

If I were being given items one by one, and I wanted a list of them all in the reverse order I got them in, I could add each item to an ArrayList, then reverse it. Both of these operations are O(n) in time complexity, and therefore my total is O(2n), which is just O(n).

However, I could also add each item as I got it to a Stack, and since Stacks are LIFO, it’s already reversed once I have all of the items. This skips the O(n) ArrayList reversing, but is still O(n) overall since getting the n items was O(n).

I think the second option would be better, since I’m avoiding an O(n) subroutine, but how can I say that I have made my algorithm more efficient?

In the context of explaining how my second algorithm is more efficient, is it appropriate to just say I have made it more efficient by removing an O(n) subroutine?