合并两个排序的链表18
2016-05-30 21:43
204 查看
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然按照递增排序。如输入链表1{1,3,5};链表2{2,4,6,8};合并后,链表3{1,2,3,4,5,6,7,8}。
链表定义:
解题思路:
鲁棒性,空链表问题(1个为空或两个都为空)
将两个链表的头节点依次比较大小再合并,因为是有序的,所以合并的步骤是一个不断递归的过程。
测试用例:
函数实现:
链表定义:
//单向链表的节点定义 struct ListNode{ int m_value; //节点存储的值 ListNode *m_next; //节点指针 void show(); //打印所有节点值 };
解题思路:
鲁棒性,空链表问题(1个为空或两个都为空)
将两个链表的头节点依次比较大小再合并,因为是有序的,所以合并的步骤是一个不断递归的过程。
测试用例:
int main(){ //创建一个多结点链表 ListNode *L2 = new ListNode; L2 = NULL; addToTail(&L2, 1); //末尾加入1 addToTail(&L2, 3); //末尾加入3 addToTail(&L2, 5); //末尾加入5 ListNode *L3 = new ListNode; L3 = NULL; addToTail(&L3, 2); //末尾加入4 addToTail(&L3, 4); //末尾加入5 addToTail(&L3, 6); //末尾加入6 addToTail(&L3, 8); //末尾加入8 //显示L2 std::cout << "L2: "; L2->show(); //Output:1,3, 5 std::cout << std::endl; //显示L3 std::cout << "L3: "; L3->show(); //Output:2,4,6, 8 std::cout << std::endl; //合并后的L2,L3 std::cout << "Adter merge: "; Merge(L2, L3)->show(); return 0; }
函数实现:
//本题函数实现 //合并连个排序的链表,并且返回合并后的头节点 ListNode* Merge(ListNode *L1, ListNode *L2){ if(L1 == NULL) return L2; else if(L2 == NULL) return L1; //合并后的头节点 ListNode *mergeHead = new ListNode; mergeHead = NULL; if(L1->m_value < L2->m_value){ mergeHead = L1; mergeHead->m_next = Merge(L1->m_next, L2); }else{ mergeHead = L2; mergeHead->m_next = Merge(L1, L2->m_next); } return mergeHead; } //以下为其他函数实现 void ListNode::show(){ ListNode *temp = this; if(temp == NULL) std::cout << "\nlist is NULL\n"; while(temp != NULL){ std::cout << temp->m_value << " "; temp = temp->m_next; } } //在一个链表的末尾添加一个节点 void addToTail(ListNode **head, int value){//由于会改动链表指针,所以必须把head参数设为指向指针的指针。否则出了这个函数作用域,改动便无效。 //1.首先创建要插入的节点 ListNode *pNew = new ListNode; pNew->m_value = value; //指定值 pNew->m_next = NULL; //!!!切记指定下一节点为NULL //2.如果传入的节点为空,可直接创键头节点 if(*head == NULL) *head = pNew; else{//否则3. //定义一个临时节点 ListNode *temp = *head; while(temp->m_next != NULL) //循环指向末尾节点, !!!切记必须指向下一节点 temp = temp->m_next; //对末尾的下一个节点赋值,取代之(末尾) temp->m_next = pNew; } }
相关文章推荐
- 利用代码扫描工具提升Android代码健壮性
- UML
- MySQL常用函数整理
- __declspec 的用法
- 河南第五届省赛 A奇怪的排序 -- (sort+STL)
- Git开发系列(一):基础
- MongoDB学习笔记
- 设计模式23篇:策略模式
- HDU 4746 Mophues【莫比乌斯反演】
- .attr()与.removeAttr()
- HDU 4746 Mophues【莫比乌斯反演】
- 23种设计模式(12):策略模式
- HDU 4746 Mophues【莫比乌斯反演】
- Oracle查询被锁的表及进程的方法
- 深入学习java并发编程:ReentrantLock
- LeetCode 65 Valid Number
- Apache Shiro
- linux下的dhcp服务器配置总结
- 鸿海为何喜欢收留贵族?
- 【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法