剑指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
原创粉丝点击