16 合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例
输入
{1,3,5},{2,4,6}
输出
{1,2,3,4,5,6}
思路:
比较两个链表当前指针值的大小,小的那个加到新链表中,指针后移。循环遍历只要有一个链表为空,将剩下的链表添到新链表后面。
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode node(0);
ListNode *res=&node;
while(pHead1!=nullptr&&pHead2!=nullptr){
if(pHead1->val<pHead2->val){
res->next=pHead1;
pHead1=pHead1->next;
}
else{
res->next=pHead2;
pHead2=pHead2->next;
}
res=res->next;
}
res->next=pHead1==nullptr?pHead2:pHead1;
return node.next;
}
};
17 树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
示例
输入
{8,8,#,9,#,2,#,5},{8,9,#,2}
输出
true
思路:
俩个树都不为空的时候开始比较,遍历pRoot1树的每一个节点找到值和pRoot2相同的节点
根节点值相同后开始比较,若其左右子树都相同则返回true
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
bool res=false;
if(pRoot1==nullptr||pRoot2==nullptr)return res;
if(pRoot1->val==pRoot2->val){
res=isSubTree(pRoot1, pRoot2);
}
if(!res){
return HasSubtree(pRoot1->left,pRoot2)
||HasSubtree(pRoot1->right,pRoot2);
}
return res;
}
bool isSubTree(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2==nullptr)return true;
if(pRoot1==nullptr)return false;
if(pRoot1->val==pRoot2->val){
return isSubTree(pRoot1->left,pRoot2->left)
&&isSubTree(pRoot1->right, pRoot2->right);
}
else return false;
}
};
18 二叉树的镜像
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
比如: 源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路:
翻转节点的左右子树,递归调用函数确保每一个节点的左右子树都做出互换。
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if(pRoot==nullptr)return nullptr;
TreeNode *temp=pRoot->left;
pRoot->left=pRoot->right;
pRoot->right=temp;
Mirror(pRoot->left);
Mirror(pRoot->right);
return pRoot;
}
};