从小到大依次输入两列整数,以-1表示结尾,然后根据这两列整数构造两个单向链表,按整数大大小关系把这两个链表合并成一个有序单向链表,最后从头到尾遍历输出这个链表的数据域(用一个空格隔开)。
/*设head1和head2是两个非空单向链表,数据值有重复且升序排序
将head1和head2合并成一个升序链
*/
#include<stdio.h>
#include<stdlib.h>
//定义结构体单元
typedef struct node{
int data;//结构体数据域
struct node* next;//结构体指针域
}ElemSN;
//逆向创建单向链表(头插法)
ElemSN *PreCreatLink(int a[],int n)
{
ElemSN *head=NULL,*p;
for(int i=n-1;i>-1;i--)
{
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=head;
head=p;
}
return head;
}
ElemSN* Combine(ElemSN *head1,ElemSN *head2)
{
ElemSN *head,*p,*tail;
head=NULL;
while(head1&&head2)
{
if(head1->data<head2->data)
{
p=head1;
head1=head1->next;
}
else
{
p=head2;
head2=head2->next;
}
p->next=NULL;
if(!head)
head=tail=p;
else
{
tail=tail->next=p;
}
}
if(head1)
p=head1;
else
p=head2;
tail->next=p;
return head;
}
//打印链表所有结点的值
void PrintLink(ElemSN* head)
{
ElemSN *p=head;
for(;p;p=p->next)
printf("%5d",p->data);
}
int main(void)
{
ElemSN *head1,*head2,*head;
int a[7]={2,3,5,6,7,9,11};
int b[5]={2,4,5,7,9};
head1=PreCreatLink(a,7); //创建链表head1
head2=PreCreatLink(b,5); //创建链表head2
head=Combine(head1,head2); //将两个有序链表合并成一个有序链表
PrintLink(head); //输出链表
}
https://blog.csdn.net/vk5176891/article/details/53649225
https://blog.csdn.net/qq_39241239/article/details/80897992