Neither method affects whether only memory is used for the temp table or whether it has to spill to disk instead. That is affected only by the volume of data.
However, a hybrid method is actually best, because:
Option #1 requires you to hard-code the column definitions in advance. That can cause errors and/or force changes when the underlying source table changes.
Option #2 places some locks and holds on system tables and can affect other people trying to load data into the same db. Also, creating a clustered index on the table, if needed, must be done after the table is loaded, which is far less efficient.
Instead, you can combine the two methods, like so:
If OBJECT_ID ('tempdb.dbo#Yaks') IS NOT NULL DROP TABLE #Yaks
--create the table structure, but without any rows in it.
SELECT TOP (0) A,B,C,D
--if the temp table would benefit from a clustered index,
--(and very often it will!, such as when JOINs or ORDER BY are use in SELECTs on the table),
--create the clus index before the table is loaded.
CREATE CLUSTERED INDEX Yaks__CL ON #Yaks ( A, B, C, D )
INSERT INTO #Yaks WITH (TABLOCK) --allows minimal logging, even in nontemp dbs.
SELECT DISTINCT A, B, C, D
ORDER BY A, B, C, D --the clus index will mean no additional sort is required to do this ORDER BY
DROP TABLE #Yaks