It would probably be good to have a few more test cases, but this works for the two you provided. I'll build up to a final solution step-by-step. First off, there is a function called IntersectingQ that will tell you if two lists intersect. We can use this to gather intersecting lists together:
Gather[blist, IntersectingQ]
(* {{{1}, {1, 4}}, {{2, 3}, {2, 4}}, {{5, 6}}} *)
This adds a level to the data, so let's flatten it and de-dupe each list:
Union @@@ Gather[blist, IntersectingQ]
(* {{1, 4}, {2, 3, 4}, {5, 6}} *)
Hmm, since it only does one pass, we did not get the expected result. This suggests nesting this repeatedly. How many times? Until we get no further merges, i.e. the result no longer changes. That's a job for FixedPoint. But it would be nicer if we created a helper function first:
GatherStep[lists : {___List}] := Union @@@ Gather[lists, IntersectingQ]
And now we can apply FixedPoint:
FixedPoint[GatherStep, blist]
(* {{1, 2, 3, 4}, {5, 6}} *)