题目:
已知两个单调递增的链表,要求实现算法合并两个链表,使得成后的链表满足单调不减规则。
思路:
本题很显然用递归方式很好实现,同时需要注意下算法的鲁棒性【对于空链表的判断】。
当然本题还有非递归的版本实现,思想与递归大致一致。每次比较链表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;
}
}
}