剑指Offer----面试题17:合并两个排序的链表
来源:互联网 发布:微.原色软件下载 编辑:程序博客网 时间:2024/05/22 17:00
题目:
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序。如下图所示:
方法一:
分析:创建新的链表3,每次比较链表1和2上相应的值,再链表3上依次创建新的结点,并将各个结点连接起来。
源代码:
#include"List.h"#include<iostream>using std::cout;using std::endl;using namespace ListSpace5;ListNode *MergeList(ListNode *list1, ListNode *list2){if (list1 == NULL && list2 == NULL){cout << "两个链表都为空" << endl;return NULL;}else if (list1 == NULL && list2 != NULL)return list2;else if (list1 != NULL && list2 == NULL)return list1;else{//两个链表都不为空ListNode *newNode = NULL;ListNode *newNodeHead = NULL;//记录新链表的头结点int count = 0;ListNode *temp = NULL;//记录上一个结点,方便连接while (list1 != NULL && list2 != NULL){if (list1->element > list2->element){newNode = CreateListNode(list2->element);ListNode *mytemp = list2;list2 = list2->next;delete mytemp;//删除结点,防止内存泄漏mytemp = nullptr;}else{newNode = CreateListNode(list1->element);ListNode *mytemp = list1;//删除结点,防止内存泄漏list1 = list1->next;delete mytemp;mytemp = nullptr;}++count;if (count == 1){newNodeHead = newNode;ConnectListNodes(newNode, NULL);}else{ConnectListNodes(temp, newNode);ConnectListNodes(newNode, NULL);}temp = newNode;newNode = newNode->next;}if (list1 == NULL)newNode = list2;if (list2 == NULL)newNode = list1;return newNodeHead;}}void test11(){cout << "\t===========测试两个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *list21 = CreateListNode(2);ListNode *list22 = CreateListNode(4);ListNode *list23 = CreateListNode(6);ListNode *list24 = CreateListNode(8);ListNode *list25 = CreateListNode(10);ListNode *list26 = CreateListNode(12);ConnectListNodes(list21, list22);ConnectListNodes(list22, list23);ConnectListNodes(list23, list24);ConnectListNodes(list24, list25);ConnectListNodes(list25, list26);ConnectListNodes(list26, NULL);ListNode *merge = MergeList(list11, list21);printList(merge);}void test12(){cout << "\t===========测试一个空链表和一个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *merge = MergeList(list11, NULL);printList(merge);}void test13(){cout << "\t===========测试一个空链表和一个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *merge = MergeList(NULL, list11);printList(merge);}void test14(){cout << "\t===========测试两个空链表的合并===========" << endl;ListNode *merge = MergeList(NULL, NULL);printList(merge);}int main(){test11();cout << endl;test12();cout << endl;test13();cout << endl;test14();cout << endl;system("pause");return 0;}运行结果:
===========测试两个非空链表的合并===========1 2 3 4 5 6 7 8 9 10 11 ===========测试一个空链表和一个非空链表的合并===========1 3 5 7 9 11 ===========测试一个空链表和一个非空链表的合并===========1 3 5 7 9 11 ===========测试两个空链表的合并===========两个链表都为空The list is empty请按任意键继续. . .
改进版Merge函数
ListNode *MergeList3(ListNode *list1, ListNode *list2){if (list1 == nullptr)return list2;if (list2 == nullptr)return list1;ListNode *root = nullptr;ListNode *prev = nullptr;ListNode *head = nullptr;int count = 0;while (list1 != nullptr && list2 != nullptr){if (list1->element > list2->element){root = list2;//充分利用原有的结点,不用创建新的结点,也不用防止内存泄漏list2 = list2->next;}else{ root = list1;list1 = list1->next;}++count;if (count == 1){head = root;root->next = nullptr;}else{prev->next = root;//将链表连接起来}prev = root;root->next = nullptr;}return head;}
方法二:
源代码如下:
#include"List.h"#include<iostream>using std::cout;using std::endl;using namespace ListSpace5;ListNode *MergeList2(ListNode *list1, ListNode *list2){if (list1 == NULL)return list2;else if (list2 == NULL)return list1;ListNode *newHead = NULL;if (list1->element < list2->element){newHead = list1;newHead->next = MergeList2(list1->next, list2);}else{newHead = list2;newHead->next = MergeList2(list1, list2->next);}return newHead;}void test21(){cout << "\t===========测试两个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *list21 = CreateListNode(2);ListNode *list22 = CreateListNode(4);ListNode *list23 = CreateListNode(6);ListNode *list24 = CreateListNode(8);ListNode *list25 = CreateListNode(10);ListNode *list26 = CreateListNode(12);ConnectListNodes(list21, list22);ConnectListNodes(list22, list23);ConnectListNodes(list23, list24);ConnectListNodes(list24, list25);ConnectListNodes(list25, list26);ConnectListNodes(list26, NULL);ListNode *merge = MergeList2(list11, list21);printList(merge);}void test22(){cout << "\t===========测试一个空链表和一个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *merge = MergeList2(list11, NULL);printList(merge);}void test23(){cout << "\t===========测试一个空链表和一个非空链表的合并===========" << endl;ListNode *list11 = CreateListNode(1);ListNode *list12 = CreateListNode(3);ListNode *list13 = CreateListNode(5);ListNode *list14 = CreateListNode(7);ListNode *list15 = CreateListNode(9);ListNode *list16 = CreateListNode(11);ConnectListNodes(list11, list12);ConnectListNodes(list12, list13);ConnectListNodes(list13, list14);ConnectListNodes(list14, list15);ConnectListNodes(list15, list16);ConnectListNodes(list16, NULL);ListNode *merge = MergeList2(NULL, list11);printList(merge);}void test24(){cout << "\t===========测试两个空链表的合并===========" << endl;ListNode *merge = MergeList2(NULL, NULL);printList(merge);}int main(){test21();cout << endl;test22();cout << endl;test23();cout << endl;test24();cout << endl;system("pause");return 0;}
运行结果和方法一相同!
0 0
- 《剑指Offer》面试题:合并两个排序的链表
- 剑指offer面试题 合并两个排序的链表
- 剑指offer面试题17-:合并两个排序链表
- [剑指offer]面试题17:合并两个排序的数组
- 面试题19:合并两个排序的链表(offer)
- [剑指offer][面试题17]合并两个排序的链表
- 剑指offer 面试题17 合并两个排序的链表
- 剑指Offer:面试题题17 合并两个排序的链表
- 《剑指Offer》面试题17:合并两个排序的链表
- 《剑指Offer》学习笔记--面试题17:合并两个排序的链表
- 剑指offer 面试题17—合并两个排序的链表
- 剑指Offer--面试题17:合并两个排序的链表--Java实现
- 【剑指Offer学习】【面试题17 ::合并两个排序的链表】
- 剑指Offer面试题17(Java版):合并两个排序的链表
- 剑指offer面试题17-合并两个排序的链表
- 剑指offer代码解析——面试题17合并两个排序的链表
- 剑指offer-面试题17:合并两个排序的链表
- 剑指offer 面试题17: 合并两个排序的链表 题解
- DES,RSA,MD5,AES加密
- building llvm 3.8.0: 安装gcc 4.8
- jQuery源码解读二
- Hibernate05-1-1双向1-1关联
- set用法实例
- 剑指Offer----面试题17:合并两个排序的链表
- Redis原理介绍
- Java多线程 - 第二篇
- 第一个SDK程序
- [Go语言] 操作channel时遇到panic怎么办?
- Android5.0的Palette(调色板)、视图阴影、着色和裁剪介绍
- 硬件加速机制
- 管理口令(P):[INS-30011] 输入的 ADMIN 口令不符合 Oracle 建议的标准
- 卡尔曼(Kalman)滤波(二)--Kalman滤波的发展历史与应用