Pensieve header: January 20: Dangerous games with Unprotect.

sl[1]={"","1"}; (* sl for "set listing" *)
sl[n_] :=sl[n]=Join[
sl[n-1],
(#<>ToString[n])& /@ Reverse[sl[n-1]]
]

sl[5] /. "" -> "∅"

SetAttributes[StringJoin,Listable];
sl2[1]={"","1"};
sl2[n_] :=sl2[n]=Join[
sl2[n-1],
Reverse[sl2[n-1]]<>ToString[n]
]

sl2[5] /. "" -> "∅"

Head /@ {7, "Love", Expand[(((x+y))^2)], x}

(s_String)<>(n_Integer) := s<>ToString[n]

Unprotect[StringJoin];
(s_String)<>(n_Integer) := s<>ToString[n]

"Love"<>7

(* Why restrict to n_Integer? Can you do better? *)

SetAttributes[StringJoin,Listable];
sl3[1]={"","1"};
sl3[n_] :=sl3[n]=Join[
sl3[n-1],
Reverse[sl3[n-1]]<>n
]

sl3[5] /. "" -> "∅"

Unprotect[Plus];
a_+b_ := a*b

2+3

2x+3x (* Thanks, Jonathan Love! *)

Head[2x]

Head /@ (2x)

?NonCommutativeMultiply