#include
#include
typedef struct node
{
int a;
struct node *next;
}*List,list;
List create(int start,int end)
{
List head=(list*)malloc(sizeof(list));
List p=head;
for(int i=start;i<=end;i++){
List t=(list*)malloc(sizeof(list));
t->a=i;
t->next=NULL;
p->next=t;
p=p->next;
}
return head;
}
void print(List head){
List p=head;
while(p){
printf("%3d",p->a);
p=p->next;
}
puts("");
}
List merge(List h1,List h2){
List p=(list*)malloc(sizeof(list));
List r=p;
h1=h1->next;
h2=h2->next;
while(h1 || h2){
if(h1==NULL){
p->next=h2;
p=p->next;
h2=h2->next;
continue;
}
if(h2==NULL){
p->next=h1;
p=p->next;
h1=h1->next;
continue;
}
if(h1->a>h2->a){
p->next=h2;
p=p->next;
h2=h2->next;
}
else {
p->next=h1;
p=p->next;
h1=h1->next;
}
}
return r;
}
int main(){
List h1=create(5,10);
List h2=create(10,15);
List h=merge(h1,h2);
print(h);
return 0;
}
if(h1->a>h2->a){
p->next=h2;
p=p->next;
h2=h2->next;
}
else if(h1->a < h2->a){
p->next=h1;
p=p->next;
h1=h1->next;
}
else{
p->next=h2;
p=p->next;
h2=h2->next; //反正两个链表头元素相等,随便加入一个
h1 = h1->next;//将另外一个无视掉就可以了
}
另外在print(h)之前最好加上h = h->next;因为按照你的写法,链表h的头元素其实是多余的
之前的回答忘记考虑了一点,就是旧链表中本身就有相同的元素,比如h1: 8 8 8 8 8, h2: 5 6 7 8 9,按原来的写法就会打出5 6 7 8 8 8 8 8 8 9,
后面改了一下,应该没问题了
if(h1->a>h2->a){
if(p->a != h2->a){//当即将加入链表p的元素与链表p末尾的元素相同时,无视掉,以免出现打印相同元素
p->next=h2;
p=p->next;
}
h2=h2->next;
}
else if(h1->a < h2->a){
if(p->a != h1->a){//同上
p->next=h1;
p=p->next;
}
h1=h1->next;
}
else{
if(p->a != h2->a){//同上
p->next=h2;
p=p->next;
}
h2=h2->next;
h1 = h1->next;
}