思路:设个指针p,指着head1和head2中数据域值较小的那一个,然后将head1或者head2后移,所以这一步为头删,p指向的结点数据域的值永远是最小的,将p->next=NULL;将该结点与head1或者head2断开,所以这样每次取出的结点都是最小的,并且p指向该结点,设一个h=NULL;将p所指向的结点往h上插入的时候就要判断该结点是新链表的头结点还是中间尾结点
如果是头结点
h = t = p;
如果是尾结点
t = t->next = p;
当head1或者head2其中有一个为NULL时跳出循环,将剩下的链表往新链表后面一插,完成升序合并。
代码如下
运行环境VS2017
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
ElemSN*fun(ElemSN*head1, ElemSN*head2)
{
ElemSN*p=NULL, *h=NULL, *t=NULL;
while (head1&&head2)
{
if (head1->date < head2->date)
{
p = head1;
head1 = head1->next;
}
else
{
p = head2;
head2 = head2->next;
}
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
if (head1)
p = head1;
else
p = head2;
t->next = p;
return h;
}
int main(void)
{
int a1[5] = { 1,3,5,7,9 };
int a2[5] = { 2,4,6,8,10 };
ElemSN*head1, *head2, *h = NULL;
head1 = GreatLink(a1, 5);
head2 = GreatLink(a2, 5);
PrintLink(head1);
PrintLink(head2);
h = fun(head1, head2);
PrintLink(h);
system("pause");
}
输出结果
1,3,5,7,9
2,4,6,8,10
1,2,3,4,5,6,7,8,9,10