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);    
    }
};