[经典面试题]求解集合A与B的差集

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

【题目】

已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。

例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

结构体:

struct ListNode{
    int val;
    ListNode *next;
};

请完成函数void difference(ListNode** LA , ListNode* LB)

------迅雷校招

【代码一】

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

struct ListNode{
    int val;
    ListNode *next;
};

// 输出集合
void Display(ListNode* root){
    ListNode* p = root;
    while(p){
        cout<<p->val<<endl;
        p = p->next;
    }
}

// 求两个集合的差集保存在LA中
void Difference(ListNode** LA,ListNode* LB){
    // 容错处理
    if(*LA == NULL || LB == NULL){
        return;
    }
    ListNode *pa,*pb,*pre,*node;
    pa = *LA;
    pre = NULL;
    bool isDelete;
    // 遍历LA
    while(pa){
        pb = LB;
        isDelete = false;
        while(pb){
            // 删除pa
            if(pa->val == pb->val){
                isDelete = true;
                // 头元素
                if(pre == NULL){
                    *LA = pa->next;
                    pa = *LA;
                }//if
                else{
                    node = pa;
                    pre->next = pa->next;
                    delete node;
                    pa = pre->next;
                }
                break;
            }//if
            pb = pb->next;
        }//while
        // 如果有删除pa跳到pa->next
        if(!isDelete){
            pre = pa;
            pa = pa->next;
        }
    }//while
}


int main(){
    int arrayA[] = {5,10,20,15,25,30};
    int arrayB[] = {5,15,35,25};
    ListNode* node;
    // 集合A
    ListNode *LA = (ListNode*)malloc(sizeof(ListNode));
    LA->val = 5;
    LA->next = NULL;
    ListNode *p = LA;
    for(int i = 1;i < 6;i++){
        node  = (ListNode*)malloc(sizeof(ListNode));
        node->val = arrayA[i];
        node->next = NULL;
        p->next = node;
        p = node;
    }

    // 集合B
    ListNode *LB = (ListNode*)malloc(sizeof(ListNode));
    LB->val = 5;
    LB->next = NULL;
    p = LB;
    for(int i = 1;i < 4;i++){
        node  = (ListNode*)malloc(sizeof(ListNode));
        node->val = arrayB[i];
        node->next = NULL;
        p->next = node;
        p = node;
    }

    // 求AB差集
    Difference(&LA,LB);
    // 输出AB差集
    Display(LA);
}


【代码二】

// 求两个集合的差集保存在LA中
void Difference(ListNode** LA,ListNode* LB){
    // 容错处理
    if(*LA == NULL || LB == NULL){
        return;
    }
    ListNode *pa,*pb,*pre,*node;
    pa = *LA;
    pre = NULL;
    // 遍历LA
    while(pa){
        pb = LB;
        // 遍历直到末尾
        while(pb != NULL && pa->val != pb->val){
            pb = pb->next;
        }//while
        // pb中没有与之相同元素
        if(pb == NULL){
            pre = pa;
            pa = pa->next;
        }
        // 有相同元素
        else{
            // 头元素
            if(pre == NULL){
                *LA = pa->next;
                pa = pa->next;
            }
            else{
                node = pa;
                pre->next = pa->next;
                pa = pa->next;
                delete node;
            }//if
        }//if
    }//while
}



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
4月前
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
103 4
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
202 3
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
12月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
1017 1
Java面试题之Java集合面试题 50道(带答案)
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
下一篇
日志分析软件