To detect differences between two lists (lets call them A and B), generally you make two passes. The first pass checks each item of A and checks if it is in B, and if so, if the item in B has been changed in some fashion (if item is mutable at least). The second pass involves checking each item of B to see if it is not in A.
At the end of these two passes, you're left with a list of all items in A and not in B, all items in B and not in A, and all items that are in both but differ.
What you're talking about is a different, but only slightly. Rather than 2 lists, you have n. I'm assuming some specifications won't apply to some products and may hence be missing.
So in order to have to perform a pass for each list, it would be simpler to combine all specifications into a single Set (eliminate duplicates). Then, for each specification, cycle through each product. Take the first product as a frame of reference and check its value. Compare that value to every other product for that specification until you find a difference. If you find a difference, break and continue with the next specification. In this way, you only have to make a single pass for each product and for each specification (ok, two if you count getting a complete list of specifications assuming you don't have it already).
In this way, you know which specifications differ between products. However in general, in a product comparison, you exclude specifications which do not differ between products, so rather than highlight those which are different, I would simply suggest to remove it entirely. However that's just my 10 cents. ;)