合并两个排序链表
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;
}
思路:典型的归并排序思路,需要注意的两个地方时: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;
}
相关文章推荐
- 剑指offer 合并两个排序的链表
- 剑指offer题解 合并两个排序的链表
- 合并两个排序的链表
- 剑指offer(十六)合并两个排序的链表
- 剑指Offer面试题25:合并两个排序的链表
- 剑指Offer 17 合并两个排序的链表
- #21 合并排序后的两个链表
- 面试题17:合并两个排序的链表
- 题目1519:合并两个排序的链表-九度
- 【剑指offer】面试题17、合并两个排序的链表
- 面试之路(29)-合并两个排序的链表(递归和非递归)
- 剑指Offer 面试题25:合并两个排序的链表(递归+非递归) Java代码实现
- 代码的鲁棒性:合并两个排序的链表
- C语言——合并两个递增排序链表
- Lintcode 合并两个排序的链表
- 合并两个排序链表
- 合并两个排序的链表
- 《剑指offer》面试题17—合并两个排序链表
- 剑指offer之合并两个排序的链表
- 码农小汪-剑指Offer之14 -合并两个排序的链表