两个有序链表合并为一个有序链表
2013-10-27 16:24
295 查看
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; struct Node { int val; Node* next; Node() { val = 0; next = NULL; } }; Node* MergeList(Node* pfirst, Node* psecond) { if (NULL == pfirst || NULL == psecond) { fprintf(stderr, "MergeList: Invalid arguments"); exit(1); } Node* ret = NULL, *pn = NULL; Node* pf = pfirst, *ps = psecond; while (NULL != pf || NULL != ps) { // 利用归并思想 Node* pt = new Node(); if (NULL == ps) { pt->val = pf->val; pf = pf->next; } else if (NULL == pf) { pt->val = ps->val; ps = ps->next; } else { // 两个指针都不为空则选择小的放入返回链表 if (pf->val < ps->val) { pt->val = pf->val; pf = pf->next; } else { pt->val = ps->val; ps = ps->next; } } if (NULL == ret) { ret = pt; pn = pt; } else { pn->next = pt; pn = pn->next; } } return ret; } Node* BuildList(int* a, int n) { if (NULL == a || 0 > n) { fprintf(stderr, "BuildList: Invalid arguments"); exit(1); } Node* ret = NULL, *pn = NULL; for (int i = 0; i < n; i++) { Node* pt = new Node(); pt->val = a[i]; if (NULL == ret) { ret = pt; pn = pt; } else { pn->next = pt; pn = pn->next; } } return ret; } void PrintList(Node* phead) { Node* pn = phead; while (pn != NULL) { printf("%d ", pn->val); pn = pn->next; } printf("\n"); } int main() { int a[] = {1, 3, 5, 9, 11}; int b[] = {2, 4, 6, 8, 10}; Node* pa = BuildList(a, 5); PrintList(pa); Node* pb = BuildList(b, 5); PrintList(pb); Node* pc = MergeList(pa, pb); while (pc != NULL) { printf("%d ", pc->val); pc = pc->next; } return 0; }
相关文章推荐
- SetIcon
- 简单算术表达式的使用
- java FCK学习使用
- opencv图片转换为avi格式视频
- PS流格式
- 课程总结
- Android系统中ContentProvider提供共享的数据
- linux chmod 详解
- B树、B-树、B+树、B*树
- 由system.currentTimeMillis() 获得当前的时间
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- 杭电1710 Binary Tree Traversals
- python start
- coursera NLP学习笔记之week3 文本分类和朴素贝叶斯
- Logcat 的常用命令说明
- 在rails 中使用oracle ,id 自动增长的处理方式
- QT Socket编程时中文显示乱码解决
- java语句简洁写法2
- Openstack源代码分析之keystone服务(keystone-all)
- Android读取txt文件乱码问题