Let's starting points are P0, Q0, and ending points are P1, Q1.
Direction vectors
DP = P1 - P0
DQ = Q1 - Q0
start difference vector
PQ = Q0 - P0
Segment in parametric form:
P = P0 + t * DP
Q = Q0 + u * DQ
Find values
a = Dot(DP, DP)
b = Dot(DP, DQ)
c = Dot(DQ, DQ)
d = Dot(DP, PQ)
e = Dot(DQ, PQ)
Find discriminant
DD = a * c- b * b
If DD = 0, then segments are parallel, and consider special case of (partial) coincidence, else
Find parameters for the closest points on lines
tt = (b * e - c * d) / DD
uu = (a * e - b * d) / DD
If any parameter is out of range 0..1, then segments don't intersect, else
Find distance between points
P(tt) = P0 + tt * DP
Q(uu) = Q0 + uu * DQ
Dist = Length(Q(uu) - P(tt))
If Dist is zero (or less than some small Epsilon value like 1.0E-12 due to numerical errors), then segments are intersect in this point P(tt)