You can use `Fold` to extend [ubpdqn's](https://mathematica.stackexchange.com/users/1997) use of `Complement` and `Union`.  Pre-sorting the lists isn't necessary, especially if they are already sorted, but it ran slightly faster on large random lists.


    list1 = {2, 5, 10, 11, 12, 17, 18};
    list2 = {5, 8, 11, 16, 19, 21};
    list3 = {5, 8, 9, 11, 16, 19, 21, 23};
    lists = {list1, list2, list3};

    Reap[Fold[(Sow @ Complement[#2, #1]; Union[##]) &, {}, Sort /@ lists]][[-1, -1]]

    (* {{2, 5, 10, 11, 12, 17, 18},
        {8, 16, 19, 21},
        {9, 23}}                    *)

Comparison with and without `Sort`:

    Block[{lists},
     SeedRandom[1]; 
     lists = Table[RandomInteger[2 * 10^5, RandomInteger[{10^3, 10^4}]], {200}]; 
     Reap[Fold[(Sow @ Complement[#2, #1]; Union[##]) &, {}, 
          Sort /@ lists]][[-1, -1]] // Last // AbsoluteTiming
     ]
    
    (* {0.951474,
        {130, 8034, 9175, 19773, 23884, 25942, 32039, 35681, 43301,
         48881, 55009, 55076, 59170, 60909, 74140, 75298, 79379, 84588, 
         96241, 100238, 101899, 104788, 106787, 109378, 110730, 118780, 
         120469, 121675, 124215, 129721, 130787, 136182, 137604, 138686, 
         143374, 152045, 161277, 169106, 171461, 188972}}                *)
    
    Block[{lists},
     SeedRandom[1]; 
     lists = Table[RandomInteger[2 10^5, RandomInteger[{10^3, 10^4}]], {200}]; 
     Reap[Fold[(Sow @ Complement[#2, #1]; Union[##]) &, {}, 
          lists]][[-1, -1]] // Last // AbsoluteTiming
     ]
    
    (* {1.009209,
        {130, ..., 188972}}  *)