您的位置:首页 > 职场人生

【面试题】剑指Offer-17-合并两个有序的单链表

2017-04-06 11:25 441 查看

题目概述



解题思路

定义两个指针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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: