/**傻逼题我还以为一个一个的连呢
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param t1 TreeNode类 
     * @param t2 TreeNode类 
     * @return TreeNode类
     */
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        // write code here
        if(t1 == NULL) return t2;
        if(t2 == NULL) return t1;
        //新节点合并相同值
        TreeNode *head = new TreeNode(t1->val + t2->val);
        //同时递归遍历两颗树
        head->left = mergeTrees(t1->left, t2->left);
        head->right = mergeTrees(t1->right, t2->right);

        return head;
    }
};

算法思想:

- 使用递归的方式合并两棵二叉树。

- 如果两棵树中的对应节点都为空,则返回空。

- 如果其中一棵树的对应节点为空,则返回另一棵树的对应节点。

- 如果两棵树的对应节点都不为空,则创建一个新节点,值为两棵树对应节点的值之和,并递归合并左子树和右子树。

时间复杂度:

O(n),其中n是两棵二叉树中节点的个数较大的那棵树的节点个数。需要遍历每个节点一次。

空间复杂度:

O(n),递归调用栈的深度最大为较大的那棵树的高度,最坏情况下,两棵树都是链表,高度为n,因此空间复杂度是O(n)。