- 题目:
输入两个递增有序的链表,合并这两个链表并使新链表中的结点仍然是有序的,具体示例如下图,链表结点定义如下:
struct ListNoe
{
ListNoe()
:_next(NULL)
, _data(0)
{}
ListNoe *_next;
int _data;
};
解法一:循环
ListNoe * Merge(ListNoe *pHead1, ListNoe *pHead2)
{
if (!pHead1)
return pHead2;
if (!pHead2)
return pHead1;
//两个链表一定不为空
ListNoe *pHead3 = NULL;
ListNoe *pPre = NULL;
if (pHead1->_data <= pHead2->_data)
{
pHead3 = pHead1;
pPre = pHead1;
pHead1 = pHead1->_next;
}
else if (pHead1->_data > pHead2->_data)
{
pHead3 = pHead2;
pPre = pHead2;
pHead2 = pHead2->_next;
}
while (pHead1 && pHead2)
{
if (pHead1->_data <= pHead2->_data)
{
pPre->_next = pHead1;
pPre = pHead1;
pHead1 = pHead1->_next;
}
else if (pHead1->_data > pHead2->_data)
{
pPre->_next = pHead2;
pPre = pHead2;
pHead2 = pHead2->_next;
}
}
if (!pHead1)
{
pPre->_next = pHead2;
}
if (!pHead2)
pPre->_next = pHead1;
return pHead3;
}
解法二:递归
ListNoe * Merge(ListNoe *pHead1, ListNoe *pHead2)
{
if (!pHead1)
return pHead2;
if (!pHead2)
return pHead1;
ListNoe *pPre = NULL;
if (pHead1->_data <= pHead2->_data)
{
pPre = pHead1;
pPre->_next = Merge(pHead1->_next, pHead2);
}
else
{
pPre = pHead2;
pPre->_next = Merge(pHead1, pHead2->_next);
}
return pPre;
}