【面试题】剑指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;
}
相关文章推荐
- 剑指Offer---面试题17:合并两个有序链表
- 剑指Offer_面试题17_合并两个有序链表
- 剑指offer面试题17——合并两个排序的链表
- 剑指offer_面试题17_合并两个排序的链表(两种思维)
- 剑指offer 面试题17 合并两个排序的链表
- 【剑指Offer学习】【面试题17 ::合并两个排序的链表】
- 剑指Offer:面试题17——合并两个排序的链表
- 剑指offer面试题17-:合并两个排序链表
- 剑指offer面试题[17]-合并两个排序的链表
- 【剑指offer】面试题17:合并两个排序的链表
- 剑指offer-面试题17.合并两个排序的链表
- 剑指Offer----面试题17:合并两个排序的链表
- 剑指offer之面试题17 :合并两个排序的链表
- 剑指offer-面试题 17:合并两个排序的链表
- 剑指offer——面试题17:合并两个排序的链表
- 【剑指offer】3.4代码的鲁棒性——面试题17:合并两个排序的链表
- 【剑指Offer】面试题17:合并两个排序的链表
- 剑指offer之面试题17 :合并两个排序的链表
- 剑指offer-面试题17-合并两个排序的链表
- 剑指offer 面试题17—合并两个排序的链表