Gale–Shapley deferred acceptance · one or more slots per mentor
Slots = how many apprentices a mentor can take. Keep at 1 for one-to-one matching.
Type each person’s ranking, 1 = most preferred. Leave a cell blank if that person is unacceptable to them — the two will never be matched.
In each round, every proposer who still has an open slot proposes to the most-preferred person on their list they haven't yet proposed to. Each receiver looks at everyone currently proposing to them (new proposals plus anyone they are already holding), tentatively holds the best ones up to their capacity, and rejects the rest. Rejected proposers move down their lists next round. The algorithm stops when no proposer with an open slot has anyone left to propose to; tentative holds then become final.
The result is stable: there is no apprentice–mentor pair who both prefer each other to what they got (with a mentor counting an open slot as better than an unacceptable apprentice). When apprentices propose, every apprentice gets the best partner they could have in any stable matching, and it is a dominant strategy for apprentices to report their true rankings. When mentors propose, the same holds for mentors. If both orders produce the same matching, the stable matching is unique.