题目概述
解题思路
定义两个指针pCur1,pCur2分别遍历两个链表
定义pPrev1,pPrev2指向pCur1,pCu2的前一个节点
根据pCur1,pCur2指向数据的大小进行判断
利用pPrev1,pPrev2改变指向
注意
1、需要定义pNewHead先判断两个链表头部节点的大小
并保存小的节点
2、在遍历改变指向的时候,注意指针是否为空
3、出循环后,必须要判断一下,因为一定是一个链表遍历完了,一个没有遍历完
并将没有遍历完的链接上去
代码实现
非递归
Node* MergeOrderListNonR(Node* phead1, Node* phead2)
{
if (phead1 == NULL)
return phead2;
if (phead2 == NULL)
return phead1;
Node* newHead = NULL;
if (phead1->_data < phead2->_data)
newHead = phead1;
else
newHead = phead2;
Node* cur1 = phead1;
Node* cur2 = phead2;
Node* prev1 = NULL;
Node* prev2 = NULL;
while (cur1 && cur2)
{
while (cur1 && cur1->_data < cur2->_data)
{
prev1 = cur1;
cur1 = cur1->_next;
}
//判断头指向了1还是2
if (prev1)
prev1->_next = cur2;
//如果cur1为空,下面会崩溃
if (cur1 == NULL)
break;
while (cur2 && cur2->_data < cur1->_data)
{
prev2 = cur2;
cur2 = cur2->_next;
}
prev2->_next = cur1;
}
if (cur1 == NULL)
prev1->_next = cur2;
else
prev2->_next = cur1;
return newHead;
}
递归实现
Node* MergeOrderList(Node* phead1, Node* phead2)
{
if (phead1 == NULL)
return phead2;
if (phead2 == NULL)
return phead1;
Node* newHead = NULL;
if (phead1->_data < phead2->_data)
{
newHead = phead1;
newHead->_next = MergeOrderList(phead1->_next, phead2);
}
else
{
newHead = phead2;
newHead->_next = MergeOrderList(phead1, phead2->_next);
}
return newHead;
}