Let's build a Staircase
Python 3, 264 Bytes
I'm not good at code golf so I'm confident this won't be the best Python 3 answer. This uses recursion and an ordered dict with all the words for each length.
from collections import*
def f(i):
d = defaultdict(list)
for l in i: x = "".join(c for c in l if c.isalnum());d[len(x)].append(x)
n = (sorted(["".join(d[z]) for z in d.keys()], key=len))
if n == i:return "\n".join(n)
return f(n)
print(f(eval(input())))
Takes input from stdin as a list, for example, test it with this list:
['A', 'small', 'one', 'that', 'contains', 'equal', 'length', 'strings', 'for', 'the', 'special', 'rule']
Will output:
A
length
oneforthe
smallequal
stringsspecial
thatrulecontains
Retina, 69 63 bytes
[^\w¶]|_ {`\b((.)+)¶((?.)+)\b(?(2)(?!)) $1$3 O$`(.)+ $#1$*
Try it online!
Husk, 11 bytes
ωȯmΣġLÖLmf□
Try it online!
Husk is younger than this challenge (which makes no difference officially, but still).
Explanation
ωȯmΣġLÖLmf□ Implicit input (list of strings), say ["a","bc","d!","123"]
mf□ Keep only alphanumeric chars of each: ["a","bc","d","123"]
ωȯ Repeat until fixed point is reached:
ÖL Sort by length: ["a","d","bc","123"]
ġL Group by length: [["a","d"],["bc"],["123"]]
mΣ Concatenate each group: ["ad","bc","123"]
Final result ["123","adbc"], print implicitly separated by newlines.