1.合并两个排序的链表
思路:首先对比两个链表的第一个节点,将较小的当作新链表的第一个节点,然后把下一个节点与之前较大的节点相比较,此处可用递归来进行。(注意鲁棒性,当链表为nullptr时应该怎么做。)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr)
return pHead2;
if(pHead2==nullptr)
return pHead1;
ListNode* newHead=nullptr;
if(pHead1->val<pHead2->val)
{
newHead=pHead1;
newHead->next=Merge(pHead1->next,pHead2);
}
else if(pHead1->val>=pHead2->val)
{
newHead=pHead2;
newHead->next=Merge(pHead1,pHead2->next);
}
return newHead;
}
};2.树的子结构
思路:首先两树的根节点先进行比较,如果相等,则判断这两个根节点的左右子树是否相等,这里也利用递归进行。需要设计两个函数:一个遍历二叉树,一个遍历根节点相同时左右子树是否对应相等。(注意代码的鲁棒性,在每一次需要访问地址的时候都问自己这个地点有没有可能是nullptr)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result=false;
if(pRoot1!=NULL&&pRoot2!=NULL)
{
if(pRoot1->val==pRoot2->val)
result=dfs(pRoot1,pRoot2);//若根节点相同,进dfs继续比
if(!result)
result=HasSubtree(pRoot1->left,pRoot2);//不等的话,拿左子树头结点比
if(!result)
result=HasSubtree(pRoot1->right,pRoot2);//再不等的话,拿右子树头结点比
}
return result;
}
bool dfs(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2==NULL) return true;//B树遍历完都对应的上,返回真
if(pRoot1==NULL) return false;//A树先遍历完了,B还没遍历完,返回假
if(pRoot1->val!=pRoot2->val)
return false;//有一会不相等就返回假
else//相等则继续比
return dfs(pRoot1->left, pRoot2->left)&&dfs(pRoot1->right, pRoot2->right);
}
};

京公网安备 11010502036488号