问题描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
对于这个问题,可以有两种解法:一是递归实现,而是非递归实现。
代码如下:
//递归实现
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
{
return pHead2;
}
if(pHead2 == NULL)
{
return pHead1;
}
ListNode* newnode = NULL;
if(pHead1->val < pHead2->val)
{
newnode = pHead1;
newnode->next = Merge(pHead1->next,pHead2);
}
else
{
newnode = pHead2;
newnode->next = Merge(pHead1,pHead2->next);
}
return newnode;
}
//非递归实现
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
{
return pHead2;
}
if(pHead2 == NULL)
{
return pHead1;
}
ListNode* newnode = NULL; //工作指针
ListNode* head = NULL; //头指针,指向合并后新链表的头结点
//取较小值作为头结点
if(pHead1->val < pHead2->val)
{
head = pHead1;
pHead1 = pHead1->next;
}
else
{
head = pHead2;
pHead2 = pHead2->next;
}
newnode = head;//使工作指针和头指针有相同的指向,都指向新链表的头结点
//往新链表中插入结点
while(pHead1 != NULL && pHead2 != NULL)
{
if(pHead1->val < pHead2->val)//如果链表1的结点小于链表2的结点
{
newnode->next = pHead1; //将这个结点插入到新链表中
pHead1 = pHead1->next; //链表1后移一位
}
else
{
newnode->next = pHead2;
pHead2 = pHead2->next;
}
newnode = newnode->next; //工作指针后移一位
}
if(pHead1 != NULL) //如果链表1没有遍历完,
{
newnode->next = pHead1; //将链表1与新链表连起来
}
if(pHead2 != NULL) //如果链表2没有遍历完,
{
newnode->next = pHead2; //将链表2与新链表连起来
}
//返回指向头结点的头指针,而不是返回工作指针,因为工作指针的位置一直在变化
return head;
}