将两个同为升序的有序链表,请将其合成为一个也是升序的链表。

将两个同为升序的有序链表,请将其合成为一个也是升序的链表。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node* next;
}linklist;
linklist* creatlinklist()
{
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
int x;
scanf("%d",&x);
while(x!=-1)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=x;
   p->next=NULL;
   r->next=p;
   r=p;   
   scanf("%d",&x);
}
return head;
}
linklist* connect(linklist* ha,linklist* hb)
{
linklist *pa=ha->next;
linklist *pb=hb->next;
linklist *hc,*p,*r;
hc=(linklist*)malloc(sizeof(linklist));

hc->next=NULL;
r=hc;
while(pa&&pb)
{
   if(pa->data<pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pa->data;
    r->next=p;
    r=r->next;
    pa=pa->next;
   }
   else if(pa->data>pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pb->data;
    r->next=p;
    r=r->next;
    pb=pb->next;
   }
   else if(pa->data==pb->data)
   {
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pa->data;
    r->next=p;
    r=r->next;
    pa=pa->next;
    p=(linklist*)malloc(sizeof(linklist));
    p->data=pb->data;
    r->next=p;
    r=r->next;
    pb=pb->next;
   }
}
while(pa)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=pa->data;
   r->next=p;
   r=r->next;
   pa=pa->next;
}
while(pb)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=pb->data;
   r->next=p;
   r=r->next;
   pb=pb->next;
}
p->next=NULL;
return hc;
}
void print(linklist *head)
{
linklist *p=head->next;
while(p)
{
   printf("%d->",p->data);
   p=p->next;
}
return;
}
int main()
{
linklist *ha=creatlinklist();
linklist *hb=creatlinklist();
linklist *hc=connect(ha,hb);
print(hc);
return 0;
}




//不申请额外空间
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node* next;
}linklist;
linklist* creatlinklist()
{
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
int x;
scanf("%d",&x);
while(x!=-1)
{
   p=(linklist*)malloc(sizeof(linklist));
   p->data=x;
   p->next=NULL;
   r->next=p;
   r=p;   
   scanf("%d",&x);
}
return head;
}
linklist* connect(linklist* ha,linklist* hb)
{
linklist *pa=ha->next;
linklist *pb=hb->next;
linklist *hc,*p,*r;
hc=(linklist*)malloc(sizeof(linklist));
hc->next=NULL;
r=hc;
while(pa&&pb)
{
   if(pa->data<pb->data)
   {
    r->next=pa;
    r=pa;
    pa=pa->next;
   }
   else if(pa->data>pb->data)
   {
    r->next=pb;
    r=pb;
    pb=pb->next;
   }
   else if(pa->data==pb->data)
   {
    r->next=pa;
    r=pa;
    r->next=pb;
    r=pb;
    pa=pa->next;
    pb=pb->next;
   }
}
while(pa)
{
   r->next=pa;
   r=pa;
   pa=pa->next;
}
while(pb)
{
   r->next=pb;
   r=pb;
   pb=pb->next;
}
r->next=NULL;
return hc;
}
void print(linklist *head)
{
linklist *p=head->next;
while(p)
{
   printf("%d->",p->data);
   p=p->next;
}
return;
}
int main()
{
linklist *ha=creatlinklist();
linklist *hb=creatlinklist();
linklist *hc=connect(ha,hb);
print(hc);
return 0;
}



http://hi.baidu.com/yangkunarsenal/item/2be38d35a6d40287c3cf296e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值