两个有序链表序列的交集

2023-09-22 16:00:33

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 2 5 -1
2 4 5 8 10 -1

输出样例:

2 5
// 引入输入输出流库
#include <iostream>
// 引入字符串库
#include <string>
// 使用标准命名空间
using namespace std;

// 定义链表节点结构体
typedef struct ListNode {
    // 节点值
    int val;
    // 下一个节点指针
    ListNode* next;
    // 构造函数,初始化节点值和下一个节点指针
    ListNode(int x) : val(x), next(NULL) {}
}ListNode_t;

// 定义三个链表节点指针
ListNode_t* s1, * s2, * s3;

// 输入函数,用于构建链表
ListNode_t* input() {
    // 节点值
    int val;
    // 头节点和当前节点指针
    ListNode_t* head, * p;
    head = p = NULL;
    // 输入节点值
    cin >> val;
    // 当节点值不为-1时,继续构建链表
    while (val != -1) {
        // 新建节点
        ListNode_t* node = new ListNode(val);
        // 如果当前节点为空,则将头节点和当前节点都指向新建节点
        if (p == NULL) {
            head = p = node;
        }
        // 否则,将当前节点的下一个节点指向新建节点,并将当前节点更新为新建节点
        else {
            p->next = node;
            p = p->next;
        }
        // 输入下一个节点值
        cin >> val;
    }
    // 返回头节点
    return head;
}

// 打印链表函数
void print(ListNode_t* head) {
    // 当前节点指针
    ListNode_t* p = head;
    // 如果头节点为空,则输出"NULL"
    if (p == NULL) {
        cout << "NULL" << endl;
        return;
    }
    // 否则,遍历链表并打印节点值
    while (p) {
        if (p && p->next)
            cout << p->val << " ";
        else
            cout << p->val;
        p = p->next;
    }
}

// 求交集函数
ListNode_t* intersection(ListNode_t* s1, ListNode_t* s2) {
    // 头节点和当前节点指针
    ListNode_t *head,*s3;
    head = s3 = NULL;
    // 当两个链表都不为空时,进行比较
    while (s1 && s2) {
        // 如果第一个链表的当前节点值大于第二个链表的当前节点值,则将第二个链表的当前节点向后移动
        if (s1->val > s2->val)
            s2 = s2->next;
        // 如果第一个链表的当前节点值小于第二个链表的当前节点值,则将第一个链表的当前节点向后移动
        else if (s1->val < s2->val)
            s1 = s1->next;
        // 如果两个链表的当前节点值相等,则将当前节点加入到交集链表中,并将两个链表的当前节点都向后移动
        else if(s1->val == s2->val){
            if (s3 == NULL) {
                head = s3 = s1;
            }
            else {
                s3->next = s1;
                s3 = s3->next;
            }
            s1 = s1->next;
            s2 = s2->next;
        }
    }
   
    // 返回交集链表的头节点
    return head;
}

// 主函数
int main() {

    // 输入两个链表
    s1 = input();
    s2 = input();
    // 求两个链表的交集
    s3 = intersection(s1,s2);
    // 打印交集链表
    print(s3);

    // 返回0,表示程序正常结束
    return 0;
}

更多推荐

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在responeheader加上Last-Modified属性(表示这个资源在服务器上的最后修改时间):-----------------------------------------------------------------------------

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗?没有吧!应为那样真的是很low的!下面说一下经理的两种自动化测试:一、将脚本写好,放在服

【Redis】redis实现限流

【Redis】redis实现限流【一】固定窗口【二】滑动窗口【三】令牌桶【四】深入分析Zset的数据结构【一】固定窗口所谓固定窗口限流就是时间窗口的起始和节数时间是固定的,在固定时间段内允许要求的请求数量访问,超过这个数量就会拒绝;当固定时间段结束后,再重新开始下一个时间段进行计数。我们可以根据当前的时间,以分钟为时间

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法,我们把构造方法和析构方法这两个方法分开来讲:1、构造方法构造方法存在于每个声明的类中,主要作用是执行一些初始化任务。如果类中没有直接声明构造方法,那么类会默认地生成一个没有参数且内存为空的构造方法。在PHP8中,构造方法的方法名称必须是两个下划线开头的,即“__const

Java多线程编程-线程间协作wait/notify

前言:本文是基于《Java多线程编程实战指南》第五章个人理解,源码是摘抄作者的源码,源码会加上自己的理解。等待与通知:wait/notify单线程的变成中,如果程序需要在满足一定条件间下操作一个目标动作,就需要if语句,而在多线程中处理这种情况,保护条件可能只是暂时的,稍后其他线程可能更新了保护条件设计共享变量而使其成

如何通过快解析测试接口内外网?本地内网ip让外网访问连接

接口调试测试是网络技术员经常工作内容之一。如在公司内部api项目webserver测试,在公司内办公室个人电脑是正常用内网IP访问连接测试的,但在外网电脑需要远程测试时需要怎么测试呢?这里提供一种内网地址让外网访问的通用方法:快解析内网映射。内网地址在外网访问的原理主要是通过快解析软件方式,将本地内网地址转换成外网可以

adb操作及常用命令

问题:nodevices/emulatorsfound:adbdevices没有连接的设备解决方案:大概率是因为usb调试功能没有打开,可以查看手机设备是否开启usb调试功能Android若未开启,可通过设置-关于手机,连续点击版本号7次,打开开发者模式后开启usb调试常用命令汇总查看连接计算机的设备:adbdevic

基于SpringBoot+Vue的旅游管理系统

目录前言一、技术栈二、系统功能介绍登录界面管理员功能模块用户功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变

WebGIS开发教程:mapbox和Cesium的区别

Mapbox和Cesium都是WebGIS领域中的开源⼯具,它们都提供了丰富的地图显示和数据可视化功能,而且都能实现三维可视化开发,但是他们在某些方面确实有一定区别。1.定位不同:Mapbox更注重静态地图和动态地图的制作和展示,特别是在移动设备和Web应用程序中的实现方面,提供了强⼤的地图渲染引擎和⼯具,能够快速构建

华为数字能源,开启超充新纪元

编辑:阿冒设计:沐由在过去很长的一段时间里,国内某著名品牌火锅是从来不担心获客的。顶峰时期,该品牌每年服务超过1.6亿人次的顾客,翻台率达到了5次/天,几乎创下了餐饮界的最高翻台率。翻台率是餐饮企业最为重要的指标之一,就如同当前风风火火的充电站。任谁都能明白无误地看出,伴随着国内新能源汽车产业规模的不断扩大,投资充电站

大型架构设计的演进之路

Java全能学习+面试指南:https://javaxiaobear.cn今天我们一起看看大型互联网系统架构的演进之路,主要包含三部分内容。第一部分是大型互联网系统的特点,分析大型互联网有哪些特点和挑战,它们是现在一些技术和架构方案产生的原因。第二部分是系统处理能力提升的两种途径,提供了两种面对挑战的解决思路。第三部分

热文推荐