Haskell, 4545 41 bytes

Starting with the empty list as an accumulator go through one of the input lists and add it's elements to the accumulator if it's in the other list but not in the accumulator so far. Membership of e inEdit:y is tested with-2 bytes thanks to @Ørjan Johansen,any(==e)y. Not-membership with1 byte thanks to @dfeuer andall(/=e)y-1 byte by myself.

Haskell, 45 bytes

f y=foldl(\s e->s++[e|any(==e)y,all(/=e)s])[]

Example usage: f [3,1,2,4,3,1,1,1,1,3] [3,1,-1,0,8,3,3,1] -> [3,1].

Starting with the empty list as an accumulator go through one of the input lists and add it's elements to the accumulator if it's in the other list but not in the accumulator so far. Membership of e iny is tested withany(==e)y. Not-membership withall(/=e)y.

Haskell, 45 bytes

f y=foldl(\s e->s++[e|any(==e)y,all(/=e)s])[]

Example usage: f [3,1,2,4,3,1,1,1,1,3] [3,1,-1,0,8,3,3,1] -> [3,1].

Starting with the empty list as an accumulator go through one of the input lists and add it's elements to the accumulator if it's in the other list but not in the accumulator so far. Membership of e in y is tested with any(==e)y. Not-membership with all(/=e)y.