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

题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(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>
#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;
}


你可能感兴趣的:(链表,遍历,合并,merge)