题目1519:合并两个排序的链表

来源:互联网 发布:新手开淘宝店怎么装修 编辑:程序博客网 时间:2024/06/05 04:15
题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。

输出:

对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。

样例输入:
5 21 3 5 7 92 40 0
样例输出:
1 2 3 4 5 7 9NULL
注意学会如何创建链表,遍历链表,输出链表等操作。
代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>struct ListNode{int value;ListNode* next;};void OutPut(ListNode *head){if(head == NULL){printf("NULL\n");}else{ListNode *p;p = head->next;while(p != NULL){if(p->next == NULL){printf("%d\n",p->value);}else{printf("%d ",p->value);}p = p->next;}}}ListNode* CreateList(ListNode *head,int n){ListNode *newNode,*p;p = head;for(int i = 0;i < n;i++){newNode = (ListNode*)malloc(sizeof(ListNode));scanf("%d",&newNode->value);newNode->next = NULL;p->next = newNode;p = newNode;}return head;}ListNode* Merge(ListNode *head1,ListNode *head2){if(head1->next == NULL && head2->next == NULL){return NULL;}else if(head2->next == NULL){return head1;}else if(head1->next == NULL){return head2;}else{ListNode *p1,*p2,*p3,*head;head = (ListNode*)malloc(sizeof(ListNode));head->next = NULL;p1 = head1->next;p2 = head2->next;p3 = head;while(p1 != NULL && p2 != NULL){if(p1->value < p2->value){p3->next = p1;p1 = p1->next;}else{p3->next = p2;p2 = p2->next;}p3 = p3->next;}while(p1 != NULL){p3->next = p1;p1 = p1->next;p3 = p3->next;}while(p2 != NULL){p3->next = p2;p2 = p2->next;p3 = p3->next;}return head;}}int main() {int n,m;while(scanf("%d %d",&n,&m) != EOF){ListNode *head1,*head2;head1 = (ListNode*)malloc(sizeof(ListNode));head2 = (ListNode*)malloc(sizeof(ListNode));head1->next = NULL;head2->next = NULL;if(n != 0){head1 = CreateList(head1,n);}if(m != 0){head2 = CreateList(head2,m);}head1 = Merge(head1,head2);if(head1 == NULL){printf("NULL\n");}else{OutPut(head1);}}return 0;}


0 0