题目:有两个带头结点的单链表,结点按元素升序排列;将两个链表归并到第三个链表,元素升序排列,并将重复的数据元素去除
一、链表定义
typedef struct LNode
{
int data;
LNode* next=NULL;
}LNode, * LinkList; //Linklist相当于LNode*
二、思路以及实现
1.链表a和b升序排列的,只需要将a和b比较其首元结点的元素大小,将元素小的结点存入c链表并将其向后指即可
例如:a链表元素为 1 -> 2 -> 3 -> 4; b链表为1 -> 4 -> 8 ;
首先比较 1 和 1 ,将a或b的首结点存入c链表,再将a和b链表向后指,再次比较a的元素2和b的元素4,2<4,所以将a向后指,b不动。以此类推直到a表或b表到尾部
部分代码如下(示例):
LinkList Lc_head = Lc; //将La,Lb链表归并到Lc链表,Lx_head用于记录头结点位置
LinkList La_head = La;
LinkList Lb_head = Lb;
while (La->next!=NULL && Lb->next!=NULL)
{
if (La->next->data < Lb->next->data)
{
Lc->next = La->next; //将较小的元素结点连接到c表
La = La->next; //La向后指,下一次比较
Lc = Lc->next; //Lc向后指,下一次存储结点
}
else if(La->next->data > Lb->next->data) //Lb->next的数据<La->next的数据
{
Lc->next = Lb->next;
Lb = Lb->next;
Lc = Lc->next;
}
else //La->next的元素等于Lb->next的元素
{
Lc->next = La->next;
La = La->next; //a向后指
Lb = Lb->next; //b向后指
Lc = Lc->next;
} //循环结束之后必有至少一个链表到达表尾
2.将未到表尾的表连接到c表后面
代码如下(示例):
if (La->next != NULL) //如果La表没存完,将剩下的La表接入Lc表
{
Lc->next = La->next;
}
if (Lb->next != NULL) //如果Lb表没存完,将剩下的Lb表接入Lc表
{
Lc->next = Lb->next;
}
总结
链表这一块最复杂的就是换指方面,尾插难度不大,中间插入的话插入结点的步骤理清就好办了。