day6

64 阅读1分钟

合并二叉树

类似于合并链表,可以直接在其中一方的数值上进行修改。同时传递两个数的节点,按照节点是否存在进行比较

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(!root1) return root2;
        if(!root2) return root1;
        if(root1 && root2) root1->val = root1->val + root2->val;
        if(root1->left || root2->left) root1->left = mergeTrees(root1->left, root2->left);
        if(root1->right || root2->right) root1->right = mergeTrees(root1->right, root2->right);
        return root1;
}

遇到的问题:

  1. 不理解递归的返回条件。分成两种情况;

    • root1和root2都存在:俩val直接相加赋给root1

    • root1和root2都不存在,或只存在其中一方:此时已经无法相加了,只能返回相对另一方(而另一方可能是空、也可能存在)

      if(!root1) return root2;
      
  2. 在写递推时,如何对于任一个孩子,只判断一次一方为空另一方不为空?而不是判断两次?

    // 当t1的左节点 为空 t2左节点不为空,就赋值过去
    if (node1->left == NULL && node2->left != NULL) {
        node1->left = node2->left;
    }
    // 当t1的右节点 为空 t2右节点不为空,就赋值过去
    if (node1->right == NULL && node2->right != NULL) {
        node1->right = node2->right;
    }
    

    用一个队列存储两个根节点的所有子节点,如果出现1存在、2不存在的情况,直接继续遍历队列就行、无需考虑迭代

环形链表

面向oj编程;但其实是要找环的,快慢指针来做

bool hasCycle(ListNode *head) {
    if(!head) return false;
    if(!head->next) return false;
    int cnt=1;
    while(head){
        if(++cnt > 10001) return true;
        head = head->next;
    }
    return false;
}