For a good discussion, instead of looking at the problem strictly programmatically, you could look at it as something you could map in vector space.
The dimensions of appointments are [startTime, endTime, location]. If you have points in one appointment that intersect with other appointments, then you have a collision.