题目
合并两个链式递增有序表,并且新链表为递减有序
输入:1 3 5 7
2 4 6
输出:7 6 5 4 3 2 1
解题思路
以链表a的头结点为新链表c的头结点,然后依次比较链表a,b的数据,取小的插入到链表c的头结点后,并且要考虑a,b有一个链表读取到尾节点时,另一个没有到尾结点的情况
解题代码
#include <stdio.h>
#include <stdlib.h>
typedef struct slist
{
int data;
struct slist* next;
}SL;
void creat(SL** l, int n)//生成有n个数据的链表
{
SL* head = (SL*)malloc(sizeof(SL));
SL* r = (SL*)malloc(sizeof(SL));
head->next = NULL;
*l = head;
r = *l;
while (n)
{
SL* new = (SL*)malloc(sizeof(SL));
new->next = NULL;
scanf("%d", &(new->data));
r->next = new;
r = new;
n--;
}
}
void print(SL* l)//打印链表
{
SL* p = l->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void merge(SL** la, SL** lb, SL** lc)//合并两个链表
{
SL* pa, *pb, *pc;
pa = (*la)->next;
pb = (*lb)->next;
*lc = *la;
pc = *lc;
if (pa->data < pb->data)//生成新链表头结点
{
(* lc)->next = pa;
pc = pa;
pa = pa->next;
pc->next = NULL;
}
else
{
(*lc)->next = pb;
pc = pb;
pb = pb->next;
pc->next = NULL;
}
while (pa || pb)
{
if (!pb || (pa && (pa->data < pb->data)))//a,b链表重新连接 并且考虑有一个链表到达尾结点的情况
{
pc = pa;
pa = pa->next;
pc->next = (*lc)->next;
(*lc)->next = pc;
}
else
{
pc = pb;
pb = pb->next;
pc->next = (*lc)->next;
(*lc)->next = pc;
}
}
free(*lb);
}
int main()
{
SL* a=NULL,*b=NULL,*c=NULL;
creat(&a, 4);
creat(&b, 3);
merge(&a, &b, &c);
print(c);
return 0;
}