合并两个排序的链表(C++版)
2015-11-29 12:08
393 查看
题目:
已知两个单调递增的链表,要求实现算法合并两个链表,使得成后的链表满足单调不减规则。
思路:
本题很显然用递归方式很好实现,同时需要注意下算法的鲁棒性【对于空链表的判断】。
当然本题还有非递归的版本实现,思想与递归大致一致。每次比较链表1和链表2结点的值,选择较小的结点作为下一个链接的结点。
贴代码:
注:
链表结点的定义如下:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
};
已知两个单调递增的链表,要求实现算法合并两个链表,使得成后的链表满足单调不减规则。
思路:
本题很显然用递归方式很好实现,同时需要注意下算法的鲁棒性【对于空链表的判断】。
当然本题还有非递归的版本实现,思想与递归大致一致。每次比较链表1和链表2结点的值,选择较小的结点作为下一个链接的结点。
贴代码:
注:
链表结点的定义如下:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
};
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) { return pHead2; } else if(pHead2 == NULL) { return pHead1; } // 2个链表都不为空链表 else { if(0) { ///////////////递归实现/////////////// ListNode *pMerge = NULL; if(pHead1->val < pHead2->val) { pMerge = pHead1; pMerge->next = Merge(pHead1->next, pHead2); } else { pMerge = pHead2; pMerge->next = Merge(pHead2->next, pHead1); } return pMerge; } else { ///////////////非递归实现/////////////// ListNode *pMerge = NULL; ListNode *pCur = NULL; while (pHead1 != NULL && pHead2 != NULL) { if (pHead1->val < pHead2->val) { if (pMerge == NULL) { pMerge = pCur = pHead1; } else { pCur->next = pHead1; pCur = pCur->next; } pHead1 = pHead1->next; } else { if (pMerge == NULL) { pMerge = pCur = pHead2; } else { pCur->next = pHead2; pCur = pCur->next; } pHead2 = pHead2->next; } } if (pHead1 == NULL) { pCur->next = pHead2; } if (pHead2 == NULL) { pCur->next = pHead1; } return pMerge; } } }
相关文章推荐
- C++模版完全解析
- C++中的static关键字
- C++标准库Vector & Iterator用法
- C++ 关于 调用函数时值传递和引用的理解
- 用c语言进行“面向对象编程”------学习doubango源码心得------阿冬专栏!!!
- C++ STL (1)set容器用法、操作详细介绍
- c++ iterator(迭代器)分类及其使用
- 实现包含min函数的栈(C++版)
- c++中string类的详解
- C++箭头操作符重载
- c++之ASSERT断言的使用
- 36.c/c++程序员面试宝典-泛型编程
- 链表反转(C++版)
- C++伸展树自顶向下实现
- C++ map的基本操作和使用
- C++ Vector的基本操作和使用
- C++ premer Plus 第6版第6章第5题 &&cin>>初步理解
- java中基本数据类型和C语言中基本数据类型转换
- 提高C/C++运行效率以及避免出现Bug的20种方法
- 《C++ primer》英文第五版阅读笔记(二十四)——try控制块和异常处理