【链表】合并两个有序链表,合并后链表依旧有序

来源:互联网 发布:台湾旅游软件 编辑:程序博客网 时间:2024/05/16 17:12

链表的结点结构

struct Node{    Node(int value)    :_value(value)    , _next(NULL)    {}    int _value;    Node* _next;};

问题描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序的。

解决问题:

方法一 递归版本

Node* Merge(Node *pHead1, Node* pHead2){    if (pHead1 == NULL)        return pHead2;    if (pHead2 == NULL)        return pHead2;    Node *pNewHead = NULL;    if (pHead1->_value <= pHead2->_value)    {        pNewHead = pHead1;        pNewHead->_next = Merge(pHead1->_next, pHead2);    }    else    {        pNewHead = pHead2;        pNewHead->_next = Merge(pHead1, pHead2->_next);    }    return pNewHead;}

方法二、非递归版本

修改结点next域的指向

Node* Merge1(Node *pHead1,Node* pHead2){    Node *p1 = pHead1;    Node *p2 = pHead2;    if (p1 == NULL)        return p2;    if (p2 == NULL)        return p1;    Node *pNewHead = NULL;    Node *pTailNode = NULL;    if (p1->_value <= p2->_value)    {        pNewHead = p1;        pTailNode = p1;        p1 = p1->_next;         }    else    {        pNewHead = p2;        pTailNode = p2;        p2 = p2->_next;    }    //修改指针的指向    while (p1 != NULL && p2 != NULL)    {        if (p1->_value <= p2->_value)        {            pTailNode->_next = p1;            pTailNode = p1;            p1 = p1->_next;        }        else        {            pTailNode->_next = p2;            pTailNode = p2;            p2 = p2->_next;        }                           }    if (p1 == NULL)        pTailNode->_next = p2;    else        pTailNode->_next = p1;    return pNewHead;}