def merge(source, destination):
    """
    Merges 2 dicts recursively.

    If leaves are lists, they are extended.
    If leaves are ints, floats, strs, they are concatenated 
    into a string, if the leaves are not the same.
    """
    for key, value in source.items():
        if isinstance(value, dict):
            # get node or create one
            node = destination.setdefault(key, {})
            merge(value, node)
        elif isinstance(value, list):
            destination[key] += value
        else:
            if destination[key] != value:
                destination[key] = f'{destination[key]},{value}'
            else:
                destination[key] = value

    return destination