合并两个排序的链表

题目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[].

算法思想:

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++];
2.由于链表的特殊性,并不需要开辟额外的空间存储合并的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值