剑指Offer----面试题17:合并两个排序的链表
2016-06-04 12:53
706 查看
题目:
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序。如下图所示:方法一:
分析:创建新的链表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; }
运行结果和方法一相同!
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- [C/C++]反转链表
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 用VBScript写合并文本文件的脚本
- C#实现基于链表的内存记事本实例
- oracle列合并的实现方法
- 使用BAT一句话命令实现快速合并JS、CSS
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- SQL 合并多行记录的方法总汇
- 一道sql面试题附答案
- C#模拟链表数据结构的实例解析
- C#实现简单合并word文档的方法
- C#自适应合并文件的方法
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法