您的位置:首页 > 职场人生

剑指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;
}


运行结果和方法一相同!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息