合并两个递增排序的链表,合成后仍然是一个递增的链表。 可以用递归和迭代两种实现方式。
迭代的方法就是以链表1为基础,将链表2的结点插入到链表1当中。要注意一点:为了找到链表2在链表1应该插入的位置,这里用了一个指针变量指向当前合并后的链表的结点的前一个节点。
#include <iostream>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode *m_nNext;
};
//迭代实现
ListNode* MergeList(ListNode *pHead1, ListNode *pHead2)
{
if( pHead1 == NULL )
return pHead2;
if( pHead2 == NULL )
return pHead1;
//默认将链表2的结点插入到链表1上
ListNode *pHead = pHead1;
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
ListNode *prev = NULL; //跟踪p1的前一个节点
while( p1 != NULL && p2 != NULL)
{
//寻找链表1中大于链表2中p2节点值的节点
if( p1->m_nValue <= p2->m_nValue )
{
prev = p1;
p1 = p1->m_nNext;
}
else
{
//处理链表2的插入位置在链表1头结点前面的情况
if(prev == NULL)
{
ListNode *ptemp = p2->m_nNext; //记录p2在链表2中的下一个节点
p2->m_nNext = p1;
prev = p2;
p2 = ptemp;
pHead = prev;
}
else
{
ListNode *ptemp = p2->m_nNext;
p2->m_nNext = p1;
prev->m_nNext = p2;
prev = p2;
p2 = ptemp;
}
}
}
//如果链表2还有多余的节点,则加在链表1的后面
if( p2 != NULL)
prev->m_nNext = p2;
return pHead;
}
//递归实现
ListNode* MergeList2(ListNode *pHead1, ListNode *pHead2)
{
if(pHead1 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead2;
ListNode *pMergeHead = NULL;
if( pHead1->m_nValue <= pHead2->m_nValue )
{
pMergeHead = pHead1;
pMergeHead->m_nNext = MergeList2(pHead1->m_nNext, pHead2);
}
else
{
pMergeHead = pHead2;
pMergeHead->m_nNext = MergeList2(pHead1, pHead2->m_nNext);
}
return pMergeHead;
}
int main()
{
ListNode n1;
n1.m_nValue = 1;
ListNode n2;
n2.m_nValue = 3;
ListNode n3;
n3.m_nValue = 6;
ListNode n4;
n4.m_nValue = 12;
ListNode n5;
n5.m_nValue = 34;
ListNode n6;
n6.m_nValue = 37;
ListNode n7;
n7.m_nValue = 40;
ListNode n8;
n8.m_nValue = 53;
n1.m_nNext = &n2;
n2.m_nNext = &n4;
n4.m_nNext = &n8;
n8.m_nNext = NULL;
n3.m_nNext = &n5;
n5.m_nNext = &n6;
n6.m_nNext = &n7;
n7.m_nNext = NULL;
ListNode *pHead = MergeList2(&n1, &n3);
while(pHead != NULL)
{
cout<<pHead->m_nValue<<' ';
pHead = pHead->m_nNext;
}
cout<<endl;
return 0;
}