题目1519:合并两个排序的链表 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1309解决:615 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 (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<iostream>
using namespace std;
struct ListNode{
int value;
ListNode* next;
};
ListNode* megerList(ListNode* aHead,ListNode* bHead){
if(aHead==NULL){
return bHead;
}
if(bHead==NULL){
return aHead;
}
ListNode* megeredHead = NULL;
if(aHead->value<bHead->value){
megeredHead = aHead;
megeredHead->next = megerList(aHead->next,bHead);
}else{
megeredHead = bHead;
megeredHead->next = megerList(aHead,bHead->next);
}
return megeredHead;
}
int main(){
int n,m;
ListNode* aNode;
ListNode* aHead;
ListNode* bNode;
ListNode* bHead;
while(scanf("%d%d",&n,&m)!=EOF){
if(n<=0&&m<=0){
printf("NULL\n");
continue;
}
//构造链表
for(int i=0;i<n;i++){
ListNode* pNew = new ListNode();
scanf("%d",&pNew->value);
pNew->next=NULL;
if(i==0){
aNode = aHead = pNew;
}else{
aNode->next = pNew;
aNode = pNew;
}
}
for(int i=0;i<m;i++){
ListNode* pNew = new ListNode();
scanf("%d",&pNew->value);
pNew->next=NULL;
if(i==0){
bNode = bHead = pNew;
}else{
bNode->next = pNew;
bNode = pNew;
}
}
ListNode* megeredHead = megerList(aHead,bHead);
while(megeredHead->next){
printf("%d ",megeredHead->value);
megeredHead = megeredHead->next;
}
printf("%d\n",megeredHead->value);
}
return 0;
}
oj地址原文:http://blog.csdn.net/hackcoder/article/details/41790803