题目1519:合并两个排序的链表
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:1519
解决:702
-
题目描述:
-
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。
-
输出:
-
对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。
-
样例输入:
-
5 2 1 3 5 7 9 2 4 0 0
-
样例输出:
-
1 2 3 4 5 7 9 NULL
-
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; Node * CreatList(int n) { Node *head=(Node *)malloc(sizeof(Node)); Node *node=head; int i; int x; for(i=0;i<n;++i) { scanf("%d",&x); Node *nodenew=(Node *)malloc(sizeof(node)); nodenew->data=x; node->next=nodenew; node=nodenew; } head=head->next; node->next=NULL; return head; } Node * MergeLists(Node * head1,Node * head2) { //Node *head=(Node *)malloc(sizeof(Node)); //Node *Head=head; Node *node; Node *head; if((head1->data)<(head2->data)) { node=head1; head1=head1->next; } else { node=head2; head2=head2->next; } head=node; while(head1!=NULL&&head2!=NULL) { //Node *nodenew=(Node *)malloc(sizeof(Node)); if((head1->data)<(head2->data)) { node->next=head1; node=node->next; head1=head1->next; } else { node->next=head2; node=node->next; head2=head2->next; } } while(head1!=NULL) { node->next=head1; node=node->next; head1=head1->next; } while(head2!=NULL) { node->next=head2; node=node->next; head2=head2->next; } return head; } void PrintList(Node *head,int n) { printf("%d",head->data); head=head->next; while(head!=NULL) { printf(" %d",head->data); head=head->next; } printf("\n"); } int main() { int n1,n2; while(scanf("%d%d",&n1,&n2)!=EOF) { if(0==n1&&0==n2) { printf("NULL\n"); } else if(0==n1) { Node *head=CreatList(n2); PrintList(head,n2); } else if(0==n2) { Node *head=CreatList(n1); PrintList(head,n1); } else { Node *head1=CreatList(n1); Node *head2=CreatList(n2); Node *head=MergeLists(head1,head2); PrintList(head, n1+n2); } } return 0; } /************************************************************** Problem: 1519 User: road Language: C Result: Accepted Time:250 ms Memory:4080 kb ****************************************************************/
-
1. 归并排序:对两个有序的数组A[]、B[]合并为一个有序数组C[].
-
算法思想:
-
2.由于链表的特殊性,并不需要开辟额外的空间存储合并的数据。while(A中还有未遍历元素&&B中也还有未遍历元素) { 如果A[i]<B[j] C[i+j]= A[i]; i++; 否则 C[i+j]=B[j]; j++; } while(A中还有未遍历的元素) C[j+i++]=A[i++]; while(B中还有未遍历的元素) C[i+j++]=B[j++];