合并两个排序链表

来源:互联网 发布:学画画软件 编辑:程序博客网 时间:2024/04/20 14:23

题目:将两个已经排序的单向链表合并为一个链表,要求空间复杂度尽可能的小。

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

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


#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;}



原创粉丝点击