您的位置:首页 > 其它

合并两个排序链表

2013-01-02 20:40 417 查看
题目:将两个已经排序的单向链表合并为一个链表,要求空间复杂度尽可能的小。

思路:典型的归并排序思路,需要注意的两个地方时:1,怎样做到新链表不申请新的空间?2,代码尽量简洁?

下面是我的解答,希望跟各位网友一起讨论,算法本身是否有优化之处?如何能改进代码风格?

[cpp]
view plaincopyprint?

#include "stdafx.h"

class Node
{
public:
int data;
Node* next;
Node() : data(-1), next(NULL){}
};

Node* Merge (Node* head1, Node* head2)
{
Node* head = NULL;
Node* ret = NULL;
while (head1 || head2)
{
Node* temp = NULL;

if (head1 && head2)
{
temp = head1->data < head2->data ? head1 : head2;
}
else
{
temp = head1 != NULL ? head1 : head2;
}

if (!head)
{
head = temp;
ret = head;
}
else
{
head->next = temp;
head = head->next;
}

if (temp == head1)
{
head1 = head1->next;
}
else
{
head2 = head2->next;
}

}
head->next = NULL;
return ret;
}

void Print(Node* head)
{
while(head)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}

void Test0()
{
Node* node1 = new Node();
Node* node2 = new Node();
printf("before merge\n");
Print(node1);
Print(node2);
Node* head = Merge(node1, node2);
printf("after merge\n");
Print(head);
}

void Test1()
{
Node* node1 = new Node();
Node* head1 = node1;
node1->data = 0;
Node* node2 = new Node();
Node* head2 = node2;
node2->data = 1;

for (int i = 2; i < 6; i+=2)
{
node1->next = new Node();
node1 = node1->next;
node1->data = i;
node1->next = NULL;

node2->next = new Node();
node2 = node2->next;
node2->data = i + 1;
node2->next = NULL;
}
printf("before merge\n");
Print(head1);
Print(head2);
Node* head = Merge(head1, head2);
printf("after merge\n");
Print(head);

}

void Test2()
{
Node* node1 = new Node();
Node* head1 = node1;
node1->data = 0;
Node* node2 = new Node();
Node* head2 = node2;
node2->data = 1;

for (int i = 2; i <= 6; i+=2)
{
node1->next = new Node();
node1 = node1->next;
node1->data = i;
node1->next = NULL;

node2->next = new Node();
node2 = node2->next;
node2->data = i + 1;
node2->next = NULL;
}

for (int j = 8; j <= 10; j++)
{
node1->next = new Node();
node1 = node1->next;
node1->data = j;
node1->next = NULL;
}
printf("before merge\n");
Print(head1);
Print(head2);
printf("after merge\n");
Node* head = Merge(head1, head2);
Print(head);

}

void Test3()
{
Node* node1 = new Node();
Node* head1 = node1;
node1->data = 0;
Node* node2 = new Node();
Node* head2 = node2;
node2->data = 1;

for (int i = 2; i <= 6; i+=2)
{
node1->next = new Node();
node1 = node1->next;
node1->data = i;
node1->next = NULL;

node2->next = new Node();
node2 = node2->next;
node2->data = i + 1;
node2->next = NULL;
}

for (int j = 7; j <= 10; j++)
{
node2->next = new Node();
node2 = node2->next;
node2->data = j;
node2->next = NULL;
}
printf("before merge\n");
Print(head1);
Print(head2);
Node* head = Merge(head1, head2);
printf("after merge\n");
Print(head);

//head1, head2 should do the memory collection job. skip for testing reason.

}

int _tmain(int argc, _TCHAR* argv[])
{
Test0();
Test1();
Test2();
Test3();
//should be more test like negative value, integer overflow...skip

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: