学无先后,达者为师

网站首页 编程语言 正文

求两个降序单链表的并集(利用原有链点)

作者:爱吃土豆的马铃薯21 更新时间: 2022-07-13 编程语言

条件限制:

1.构造出A与B的并集新链表C,链表中元素依然降序排列,且没有重复元素
2. 要求C链表的链点为A、B表中原来的链点,且求并集后,A、B链表只剩下头结点,最后要求遍历C链表。
解题思路:
解这个题有俩个关键点:
3. 当a,b链表都不为空的时候,判断a,b链表中值的大小
判空,主要通过这个代码

while(ra && rb)

这里还有比较重要的就是这段代码,
将a或者b链表的节点,连接到c链表上

 			a->next = ra->next;
            rc->next = ra;
            rc = ra; 
            rc->next = NULL;
            ra = a->next; 

2.当a, b链表中有一个遍历为空的时候,直接将不为空的链表链接在c链表后面

存储结构:

typedef int DataType;
typedef struct Node
{
    DataType data;      // data域用于存储数据元素
    struct Node *next;  // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList;  // LinkList为头指针

主函数:

int main()
{
  char ch;
    LinkList aa,bb,cc;
    DataType x;
    int pos = 1;
    InitLinkList(&aa);
    InitLinkList(&bb);
    InitLinkList(&cc);
    do
    {  
        scanf("%d",&x);
        LinkListInsert( aa , pos++ , x );    //插入节点函数 该函数的实现博主没有细写,如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    pos = 1;                    
    do
    {  
        scanf("%d",&x);
        LinkListInsert( bb , pos++ , x );         //插入节点函数 该函数的实现博主没有细写,如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    UnionAB( aa , bb , &cc );        // 本题要求实现函数
    if ( aa->next == NULL && bb->next == NULL )
    {
            printf("单链表C是\n");            
            TraverseLinkList( cc );    
    }    
    DestroyLinkList(aa);
    DestroyLinkList(bb);
    DestroyLinkList(cc);
    return 0;
    }

题解函数

void UnionAB( LinkList a , LinkList b , LinkList *c )
{
    LinkList ra = a->next;
    LinkList rb = b->next;
    LinkList rc = (*c);
  // 判断在a,b链表都存在的的时候
    while(ra && rb)
    {
      //判断a,b表中谁的值大
   		 //a表值大 加入表
        if(ra->data > rb->data)
        {  
            a->next = ra->next;
            rc->next = ra;
            rc = ra; // 移动rc指针到尾节点的位置
            rc->next = NULL;
            ra = a->next; //这一句非常关键,重新给ra指针赋值
        }
         //b表值大 加入表
        else if(ra->data < rb->data)
        { 
            b->next = rb->next;
            rc->next = rb;
            rc = rb;
            rc->next = NULL;
            rb = b->next;
        }
         //相同只让一个链表的值加入c链表
        else
        {// 这里可以让a链表的,也可以让b链表的,但是另一个链表必须舍弃掉该链节点
        // 博主这里让a链表的节点加入c链表
            a->next = ra->next;
            rc->next = ra;
            rc = ra;
            rc->next = NULL;
            ra = a->next;
            // 舍弃b链表中的该节点
            b->next = rb->next;
            rb = b->next;
        }
    }
    //a 表比b表长
    if(ra)
    { 
        rc->next = ra;
        a->next = NULL;
    }
    //b表比a表长
    if(rb)
    {
        rc->next =rb;
        b->next = NULL;
    }
}

原文链接:https://blog.csdn.net/smallcabbage12/article/details/125730030

栏目分类
最近更新