单链表反转 - 有序链表合并 - 子树包含

来源:互联网 发布:最短路径优先算法 编辑:程序博客网 时间:2024/06/09 20:51

链表定义:

struct ListNode{int   m_nValue;ListNode*   m_pNext;};
1。题目描述:

定义一个函数:输入一个链表的头结点,反转该链表并输出反转后链表的头节点。

ListNode* ReverseList(ListNode* pHead){    ListNode* pReversedHead = NULL;    ListNode* pNode = pHead;    ListNode* pPrev = NULL;    while(pNode != NULL)    {        ListNode* pNext = pNode->m_pNext;        if(pNext == NULL)            pReversedHead = pNode;        pNode->m_pNext = pPrev;        pPrev = pNode;        pNode = pNext;    }    return pReversedHead;}
需要考虑链表的健壮性。

pHead为空?只有一个节点?

2.合并两个有序链表

题目描述:

输入两个递增排序的链表,合并这两个链表并使合并后的链表任是递增有序。

ListNode* Merge(ListNode* pHead1, ListNode* pHead2){    if(pHead1 == NULL)        return pHead2;    else if(pHead2 == NULL)        return pHead1;    ListNode* pMergedHead = NULL;    if(pHead1->m_nValue < pHead2->m_nValue)    {        pMergedHead = pHead1;        pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);    }    else    {        pMergedHead = pHead2;        pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);    }    return pMergedHead;}
需要考虑:链表是否为空,哪一个为空或者都为空,这些影响程序健壮性的情况。


3.子树包含

题目描述:

输入两棵二叉树A和B,判断B是否是A的子树。

二叉树结构定义如下:

struct BinaryTreeNode{int   m_nValue;BinaryTreeNode*   m_pLeft;BinaryTreeNode*   m_pRight;};
bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){    bool result = false;    if(pRoot1 != NULL && pRoot2 != NULL)    {        if(pRoot1->m_nValue == pRoot2->m_nValue)            result = DoesTree1HaveTree2(pRoot1, pRoot2);        if(!result)            result = HasSubtree(pRoot1->m_pLeft, pRoot2);        if(!result)            result = HasSubtree(pRoot1->m_pRight, pRoot2);    }    return result;}bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){    if(pRoot2 == NULL)        return true;    if(pRoot1 == NULL)        return false;    if(pRoot1->m_nValue != pRoot2->m_nValue)        return false;    return DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) &&        DoesTree1HaveTree2(pRoot1->m_pRight, pRoot2->m_pRight);}
首先找到第一相同的节点,即子树B的跟节点相同的节点:HasSubtree

然后,从该节点开始比较,直到判断A和B完全相同为止:DoesTree1HaveTree2


原创粉丝点击