合并有序链表
2015-08-19 23:45
316 查看
using namespace std;
struct ListNode
{
int m_Data;
ListNode* m_pNext;
ListNode(int value,ListNode* next = NULL):m_Data(value),m_pNext(next){}
};
/*
两个链表 比如链表1: 1->3->5->7->9
链表2: 2->4->6->8->10
跟我们合并两个数组一样,链表1的头结点 和链表2的头节点比较,如果链表1头节点的值大于链表2头接点的值,
那么链表2的头结点为合并链表的头结点,那么链表1的头节点继续和链表2的第二个节点(剩余链表2的头结点)
作比较,但一个链表遍历完之后,如果另外一个链表还没有遍历完,因为链表本来就是排序的,所以让合并链表的
尾巴节点指向未遍历完链表的头结点就可以
举个例子:
链表1: 1,3,5,23,34;
链表2: 2,4,6,8,10;
当遍历之后 链表3:1,2,3,4,8,10 此时链表2已经遍历完,while循环退出,但是剩余链表1还有 23,34
此时 让链表3的尾巴节点10 链接 剩余链表的头节点 23 就可以了
*/
ListNode* MergeList2(ListNode* head1,ListNode* head2)
{
if (head1 == NULL)
{
return head2;
}
else if(head2 == NULL)
{
return head1;
}
ListNode* MergeHead = NULL;
if (head1->m_Data < head2->m_Data)
{
MergeHead = head1;
head1 = head1->m_pNext;
}
else
{
MergeHead = head2;
head2 = head2->m_pNext;
}
ListNode* tmpNode = MergeHead;
while (head1&&head2)
{
if (head1->m_Data < head2->m_Data)
{
MergeHead->m_pNext = head1;
head1 = head1->m_pNext;
}
else
{
MergeHead->m_pNext = head2;
head2 = head2->m_pNext;
}
MergeHead = MergeHead->m_pNext;
}
if (head1)
{
MergeHead->m_pNext = head1;
}
if (head2)
{
MergeHead->m_pNext = head2;
}
return tmpNode;
}
int _tmain(int argc, _TCHAR* argv[])
{
ListNode* pHead1 = new ListNode(1);
ListNode* pCur = pHead1;
for (int i = 3; i < 10; i+=2)
{
ListNode* tmpNode = new ListNode(i);
pCur->m_pNext = tmpNode;
pCur = tmpNode;
}
ListNode* pHead2 = new ListNode(2);
pCur = pHead2;
for (int j = 4; j < 10; j+=2)
{
ListNode* tmpNode = new ListNode(j);
pCur->m_pNext = tmpNode;
pCur = tmpNode;
}
ListNode* head = MergeList2(pHead1,pHead2);
while (head)
{
cout<<head->m_Data<<" ";
head=head->m_pNext;
}
getchar();
return 0;
}</span>
struct ListNode
{
int m_Data;
ListNode* m_pNext;
ListNode(int value,ListNode* next = NULL):m_Data(value),m_pNext(next){}
};
/*
两个链表 比如链表1: 1->3->5->7->9
链表2: 2->4->6->8->10
跟我们合并两个数组一样,链表1的头结点 和链表2的头节点比较,如果链表1头节点的值大于链表2头接点的值,
那么链表2的头结点为合并链表的头结点,那么链表1的头节点继续和链表2的第二个节点(剩余链表2的头结点)
作比较,但一个链表遍历完之后,如果另外一个链表还没有遍历完,因为链表本来就是排序的,所以让合并链表的
尾巴节点指向未遍历完链表的头结点就可以
举个例子:
链表1: 1,3,5,23,34;
链表2: 2,4,6,8,10;
当遍历之后 链表3:1,2,3,4,8,10 此时链表2已经遍历完,while循环退出,但是剩余链表1还有 23,34
此时 让链表3的尾巴节点10 链接 剩余链表的头节点 23 就可以了
*/
ListNode* MergeList2(ListNode* head1,ListNode* head2)
{
if (head1 == NULL)
{
return head2;
}
else if(head2 == NULL)
{
return head1;
}
ListNode* MergeHead = NULL;
if (head1->m_Data < head2->m_Data)
{
MergeHead = head1;
head1 = head1->m_pNext;
}
else
{
MergeHead = head2;
head2 = head2->m_pNext;
}
ListNode* tmpNode = MergeHead;
while (head1&&head2)
{
if (head1->m_Data < head2->m_Data)
{
MergeHead->m_pNext = head1;
head1 = head1->m_pNext;
}
else
{
MergeHead->m_pNext = head2;
head2 = head2->m_pNext;
}
MergeHead = MergeHead->m_pNext;
}
if (head1)
{
MergeHead->m_pNext = head1;
}
if (head2)
{
MergeHead->m_pNext = head2;
}
return tmpNode;
}
int _tmain(int argc, _TCHAR* argv[])
{
ListNode* pHead1 = new ListNode(1);
ListNode* pCur = pHead1;
for (int i = 3; i < 10; i+=2)
{
ListNode* tmpNode = new ListNode(i);
pCur->m_pNext = tmpNode;
pCur = tmpNode;
}
ListNode* pHead2 = new ListNode(2);
pCur = pHead2;
for (int j = 4; j < 10; j+=2)
{
ListNode* tmpNode = new ListNode(j);
pCur->m_pNext = tmpNode;
pCur = tmpNode;
}
ListNode* head = MergeList2(pHead1,pHead2);
while (head)
{
cout<<head->m_Data<<" ";
head=head->m_pNext;
}
getchar();
return 0;
}</span>
相关文章推荐
- hadoop
- uva 11978 - Fukushima Nuclear Blast(二分+几何)
- 第一个博文想试试效果
- Low Memory Killer
- 使用CocoaPods过程中的几个问题
- 8.19方法调用笔记
- 9款Android常用的快速开发框架
- ActionCamera,OrbitCamera源码解析
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
- 使用json-lib进行Java和JSON之间的转换
- uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)
- 独立日记 2015年8月19日 quick 3.5 + sublime环境搭建
- java基础学习集合学习笔记
- android activity 组件详解
- Python & OpenCV混合编程
- 一个优秀的程序员是如何炼成的?(大神、小白通吃的干货,不信你
- 关于异步:再次思考和澄清
- Android应用程序优化注意事项
- React实践笔记-Introduction
- 自定义Adapter将图片在GridView中显示