实验11-2-5 链表拼接(20 分)
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:
1 2 3 4
| struct ListNode { int data; struct ListNode *next; };
|
函数接口定义:
1
| struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
|
其中list1
和list2
是用户传入的两个按data
升序链接的链表的头指针;函数mergelists
将两个链表合并成一个按data
升序链接的链表,并返回结果链表的头指针。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <stdio.h> #include <stdlib.h>
struct ListNode { int data; struct ListNode *next; };
struct ListNode *createlist(); struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2); void printlist( struct ListNode *head ) { struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); }
int main() { struct ListNode *list1, *list2;
list1 = createlist(); list2 = createlist(); list1 = mergelists(list1, list2); printlist(list1); return 0; }
|
输入样例:
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #include <stdio.h> #include <stdlib.h>
struct ListNode { int data; struct ListNode *next; };
struct ListNode *createlist(); struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2); void printlist( struct ListNode *head ) { struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); }
int main() { struct ListNode *list1, *list2;
list1 = createlist(); list2 = createlist(); list1 = mergelists(list1, list2); printlist(list1); return 0; } struct ListNode *createlist() { struct ListNode *p,*h,*q; p=q=(struct ListNode*)malloc(sizeof(struct ListNode)); h=(struct ListNode*)malloc(sizeof(struct ListNode)); int data; h=p; scanf("%d",&data); while(data!=-1) { p->data=data; q->next=p; q=p; p=(struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d",&data); } q->next=NULL; free(p); return h; } struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) { int num = 0; int temp[100]; struct ListNode *p = list1; while(p != NULL) { temp[num] = p->data; num++; p = p->next; } p = list2; while(p != NULL) { temp[num] = p->data; num++; p = p->next; } int i,j; for(i = 0; i < num; i++) for(j = i + 1; j < num; j++) { if(temp[i] > temp[j]) { int t; t = temp[i]; temp[i] = temp[j]; temp[j] = t; } } struct ListNode *newlist = NULL; struct ListNode *endlist = NULL; struct ListNode *q; for(i = 0; i < num; i++) { q = (struct ListNode *)malloc(sizeof(struct ListNode)); q->data = temp[i]; if(newlist == NULL) { newlist = q; newlist->next = NULL; } if(endlist != NULL) { endlist->next = q; } endlist = q; endlist->next = NULL; } return newlist; }
|