合并二叉树
类似于合并链表,可以直接在其中一方的数值上进行修改。同时传递两个数的节点,按照节点是否存在进行比较
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;
}
遇到的问题:
-
不理解递归的返回条件。分成两种情况;
-
root1和root2都存在:俩val直接相加赋给root1
-
root1和root2都不存在,或只存在其中一方:此时已经无法相加了,只能返回相对另一方(而另一方可能是空、也可能存在)
if(!root1) return root2;
-
-
在写递推时,如何对于任一个孩子,只判断一次一方为空另一方不为空?而不是判断两次?
// 当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;
}