将两个有序单链表合并
2015-07-31 21:43
375 查看
假设有两个单链表,头结点分别为 list1, list2, 如果 list1为空,直接返回 list2,如果list2为空,直接返回 list1,如果两个链表均存在,那么这两个链表进行逐个元素的比较,如果list1中的元素大于 list2的,将list2的值保存到合并链表中,否则,将list1中的值保存到合并链表中去,如果任何一个链表遍历结束,将另外一个链表的余下部分保存到合并链表中去
LinkedList *MergeLinkedList(LinkedList *MergeList, LinkedList *list1, LinkedList *list2) { if (list1 == NULL && list2 != NULL) return list2; if (list1 != NULL && list2 == NULL) return list1; if (list1 == NULL && list2 == NULL) { printf("待合并链表均为空,无需合并!\n"); return NULL; } if (MergeList == NULL) { printf("保留合并结果的链表创建失败!\n"); return NULL; } LinkedList *p1, *p2; p1 = list1;//用来循环遍历链表 list1 p2 = list2;//用来循环遍历链表 list2 /* 交替遍历两个链表 */ int MergeValue = 0;//每次保存两个链表中较小值,然后保存到合并链表 MergeList中去 LinkedList *TempMergeNode = MergeList; //开始赋值为合并存储链表的头结点 while (p1->next != NULL && p2->next != NULL) { if (p1->next->iValue >= p2->next->iValue) { MergeValue = p2->next->iValue; p2 = p2->next; } else { MergeValue = p1->next->iValue; p1 = p1->next; } //将链表1和链表2节点中的较大值存入合并链表节点中 { LinkedList *MergeNode = (LinkedList *)malloc(sizeof(LinkedList)); if (MergeNode==NULL) { printf("链表创建失败!\n"); return NULL; } MergeNode->iValue = MergeValue; //采用尾插法创建合并链表 MergeNode->next = NULL; TempMergeNode->next = MergeNode; TempMergeNode = MergeNode; } } if (p1->next != NULL && p2->next==NULL)//链表 list2 长度小于 list1,余下部分保存到 合并链表中 { TempMergeNode->next = p1->next; return MergeList; } else if (p1->next ==NULL && p2->next != NULL) //链表 list2 长度大于 list1,余下部分保存到 合并链表中 { TempMergeNode->next = p2->next; return MergeList; } } int main() { LinkedList *MList, *list1, *list2; MList = InitialLinkedList();//创建单链表头结点 list1 = InitialLinkedList(); list2 = InitialLinkedList(); CreateLinkedList(list1);//创建带头结点的单链表 CreateLinkedList(list2); MergeLinkedList(MList, list1, list2);//合并两个有序单链表 PrintLinkedList(MList);//打印显示单链表中的元素 getchar(); return 0; }
相关文章推荐
- 腾讯、阿里2014实习招聘面经
- R语言——七月
- hdu 5294 Tricks Device(最短路)
- 单片机small、compact、large存储模式
- 四色问题
- 哈理工2015暑假训练赛BNU16488 Easy Task(简单题)
- sql——存储过程&触发器(2/3)
- 没有对公账户微信认证方法
- ecshop类的解析1
- 游戏引擎网络开发者的 64 做与不做 | Part 1 | 客户端方面
- MJExtension的一些实用技巧
- 移动端适配
- NLog 相关
- LIS longest Increasing subarray 最长递增子序列
- Python删除指定时间的文件
- xml复习
- MySQL数据库的基础操作(建表,建库,插入,删除)
- [IOS] Class Memory Analysis
- C++ 智能指针详解
- 没有组织机构代码证、公章怎么认证微信公众号?