您的位置:首页 > 编程语言 > C语言/C++

合并两个排序的链表(C++版)

2015-11-29 12:08 393 查看
题目:

已知两个单调递增的链表,要求实现算法合并两个链表,使得成后的链表满足单调不减规则。

思路:

本题很显然用递归方式很好实现,同时需要注意下算法的鲁棒性【对于空链表的判断】。

当然本题还有非递归的版本实现,思想与递归大致一致。每次比较链表1和链表2结点的值,选择较小的结点作为下一个链接的结点。

贴代码:

注:

链表结点的定义如下:

struct ListNode {

int val;

struct ListNode *next;

ListNode(int x) :val(x), next(NULL) {}

};

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
{
return pHead2;
}
else if(pHead2 == NULL)
{
return pHead1;
}
// 2个链表都不为空链表
else
{

if(0)
{
///////////////递归实现///////////////

ListNode *pMerge = NULL;

if(pHead1->val < pHead2->val)
{
pMerge = pHead1;
pMerge->next = Merge(pHead1->next, pHead2);
}
else
{
pMerge = pHead2;
pMerge->next = Merge(pHead2->next, pHead1);
}

return pMerge;
}
else
{
///////////////非递归实现///////////////
ListNode *pMerge = NULL;
ListNode *pCur = NULL;

while (pHead1 != NULL && pHead2 != NULL)
{
if (pHead1->val < pHead2->val)
{
if (pMerge == NULL)
{
pMerge = pCur = pHead1;
}
else
{
pCur->next = pHead1;
pCur = pCur->next;
}
pHead1 = pHead1->next;
}
else
{
if (pMerge == NULL)
{
pMerge = pCur = pHead2;
}
else
{
pCur->next = pHead2;
pCur = pCur->next;
}
pHead2 = pHead2->next;
}

}
if (pHead1 ==  NULL)
{
pCur->next = pHead2;
}
if (pHead2 == NULL)
{
pCur->next = pHead1;
}

return pMerge;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: