新手小白第一次写文章,望大家多多支持,也欢迎各位大佬批评指正🙏🙏🙏
文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
分别建立两个有3个结点的单链表(有头结点),采用逐个交叉方式合并两个单链表,显示合并后的单链表。
样例输入
1 3 5
2 4 6
样例输出
1 2 3 4 5 6
语言
C
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
1.套用尾插法建立带头结点的链表模板
//尾插法建立带头结点的链表
LinkList CreateFromTail() /*将新增的字符追加到链表的末尾*/
{
LinkList L;
Node *r, *s;
int flag = 1;
L = (Node *)malloc(sizeof(Node)); /*为头结点分配存储空间*/
L->next = NULL;
r = L; /*r指针始终动态指向链表的当前表尾*/
while(flag) /*标志,初值为1。输入"$"时flag为0,链表结束*/
{
char c = getchar();
if(c != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
return L;
}
根据题意,该链表有3个结点,因此定义一个flag变量用来计数,初值为3,每读入一个结点,自减一,当flag为0时退出循环,完成一个单链表的建立,这样处理避免了时间超限问题。
2.套用合并两个有序的带头结点的单链表模板
合并两个有序的带头结点的单链表
LinkList MergeLinkList1(LinkList LA, LinkList LB)
{
Node *pa, *pb;
LinkList LC;
pa = LA->next;
pb = LB->next;
LC = LA;
LC->next = NULL;
LinkList r = LC;
while(pa != NULL && pb != NULL)
{
if(pa->data <= pb->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
if(pa)
{
r->next = pa;
free(LA);
return(LC);
}
else
{
r->next = pb;
free(LB);
return(LC);
}
}
源代码
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node ,*LinkList;
LinkList CreateFromTail()
{
LinkList L;
int x;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
int flag = 3;
r = L;
while(flag--)
{
scanf("%d",&x);
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void PrintLinkList(LinkList L)
{
Node *r = L->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
}
//合并两个单链表:
LinkList MergeLinkList1(LinkList LA, LinkList LB)
{
Node *pa, *pb;
LinkList LC;
pa = LA->next;
pb = LB->next;
LC = LA;
LC->next = NULL;
LinkList r = LC;
while(pa != NULL || pa != NULL)
{
if(pa != NULL)
{
r->next = pa;
r = pa;
pa = pa->next;
}
if(pb != NULL)
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
return LC;
}
int main()
{
LinkList L1 = CreateFromTail();
LinkList L2 = CreateFromTail();
LinkList L3 = MergeLinkList1(L1, L2);
PrintLinkList(L3);
return 0;
}