C/C++每日一练(20230508) 相交链表、字符数组、排序链表

news2025/1/12 18:40:54

目录

1. 相交链表  🌟🌟

2. 字符数组  ※

3. 排序链表  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 10^4
  • 1 <= Node.val <= 10^5
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

出处:

https://edu.csdn.net/practice/27308139

代码:

#include <bits/stdc++.h>
using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution
{
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
    {
        if (!headA || !headB)
        {
            return NULL;
        }
        ListNode *cur1 = headA;
        ListNode *cur2 = headB;
        while (cur1 != cur2)
        {
            cur1 = cur1 ? cur1->next : headB;
            cur2 = cur2 ? cur2->next : headA;
        }
        return cur1;
    }
};

ListNode* buildNodeList(vector<int> vec) {
    ListNode *head = new ListNode(0);
    ListNode *p = head;
    for (size_t i = 0; i < vec.size(); i++) {
        ListNode *node = new ListNode(vec[i]);
        p->next = node;
        p = p->next;
    }
    return head->next;
}

void testIntersection(ListNode *headA, ListNode *headB, int skipA, int skipB){
    ListNode *p = headA, *q = headB;
    for (int i = 0; i < skipA; i++)
    	p = p->next;
    for (int i = 0; i < skipB; i++)
    	q = q->next;
    if (p != NULL && q->next != NULL)
    	q->next = p; 
    Solution sol;
    ListNode *res = sol.getIntersectionNode(headA, headB);
    if (res != NULL)
    	cout << "Intersected at: " << res->val << endl;
    else
        cout << "null" << endl;
}

int main()
{
    vector<int> listA = {4,1,8,4,5};
    vector<int> listB = {5,0,1,8,4,5};
    int skipA = 2, skipB = 3;
    ListNode *headA = buildNodeList(listA);
    ListNode *headB = buildNodeList(listB);
	testIntersection(headA,headB,skipA, skipB);
	
    listA = {0,9,1,2,4};
    listB = {3,2,4};
    skipA = 3; skipB = 1;
    headA = buildNodeList(listA);
    headB = buildNodeList(listB);
	testIntersection(headA,headB,skipA, skipB);

    listA = {2,6,4};
    listB = {1,5};
    skipA = 3; skipB = 2;
    headA = buildNodeList(listA);
    headB = buildNodeList(listB);
	testIntersection(headA,headB,skipA, skipB);

    return 0;
}

输出:

Intersected at: 8
Intersected at: 2
null


2. 字符数组

编写一个以两个字符数组作为输入的函数。
如果第二个数组包含在第一个数组中,则函数返回第一个数组中第二个数组开始的第一个索引。
如果第二个数组不被包含在第一个数组,然后函数应该return -1
输入 [’c’,’a’,’l’,’l’,’i’,’n’,’g’] 和 [’a’,’l’,’l’] 就 return 1.
输入 [’c’,’a’,’l’,’l’,’i’,’n’,’g’] 和 [’a’,’n’] 就 return -1.

以下程序实现了这一功能,请你补全空白处内容:

```c++
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char a[128], b[128];
    int numA, numB;
    cout << "请输入第一个数组元素个数:";
    cin >> numA;
    cout << "请输入第一个数组元素:";
    for (int i = 0; i < numA; ++i)
        cin >> a[i];
    cin.clear();
    cin.sync();
    cout << "请输入第二个数组元素个数:";
    cin >> numB;
    cout << "请输入第二个数组元素:";
    for (int i = 0; i < numB; ++i)
        cin >> b[i];
    int num = 0;
    string index;
    for (int j = 0; j < numB; j++)
    {
        for (int k = 0; k < numA; k++)
        {
            if (b[j] == a[k])
            {
                __________________;
            }
        }
    }
    if (num == numB)
    {
        cout << "第二个数组包含在第一个数组中" << endl;
        cout << "第一个数组中第二个数组开始的第一个索引为:" << index.substr(0, 1) << endl;
    }
    else
        cout << "第二个数组不被包含在第一个数组";
    system("pause");
    return 0;
}
```

出处:

https://edu.csdn.net/practice/27308140

代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    char a[128], b[128];
    int numA, numB;
    cout << "请输入第一个数组元素个数:";
    cin >> numA;
    cout << "请输入第一个数组元素:";
    for (int i = 0; i < numA; ++i)
        cin >> a[i];
    cin.clear();
    cin.sync();
    cout << "请输入第二个数组元素个数:";
    cin >> numB;
    cout << "请输入第二个数组元素:";
    for (int i = 0; i < numB; ++i)
        cin >> b[i];
    int num = 0;
    string index;
    for (int j = 0; j < numB; j++)
    {
        for (int k = 0; k < numA; k++)
        {
            if (b[j] == a[k])
            {
                index += to_string(k);
                num++;
                break;
            }
        }
    }
    if (num == numB)
    {
        cout << "第二个数组包含在第一个数组中" << endl;
        cout << "第一个数组中第二个数组开始的第一个索引为:" << index.substr(0, 1) << endl;
    }
    else
        cout << "第二个数组不被包含在第一个数组";
    system("pause");
    return 0;
}

输出:


3. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

进阶:

  • 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

示例 1:

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目在范围 [0, 5 * 10^4] 内
  • -10^5 <= Node.val <= 10^5

出处:

https://edu.csdn.net/practice/27308141

代码:

#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *sortList(ListNode *head)
    {
        return mergesort(head);
    }
    ListNode *mergesort(ListNode *node)
    {
        if (!node || !node->next)
            return node;
        ListNode *fast = node;
        ListNode *slow = node;
        ListNode *brek = node;
        while (fast && fast->next)
        {
            fast = fast->next->next;
            brek = slow;
            slow = slow->next;
        }
        brek->next = nullptr;
        ListNode *l1 = mergesort(node);
        ListNode *l2 = mergesort(slow);
        return merge(l1, l2);
    }
    ListNode *merge(ListNode *l1, ListNode *l2)
    {
        if (l1 == NULL)
        {
            return l2;
        }
        if (l2 == NULL)
        {
            return l1;
        }
        if (l1->val < l2->val)
        {
            l1->next = merge(l1->next, l2);
            return l1;
        }
        else
        {
            l2->next = merge(l2->next, l1);
            return l2;
        }
    }
};

ListNode* buildNodeList(vector<int> vec) {
    ListNode *head = new ListNode(0);
    ListNode *p = head;
    for (size_t i = 0; i < vec.size(); i++) {
        ListNode *node = new ListNode(vec[i]);
        p->next = node;
        p = p->next;
    }
    return head->next;
}

string NodeList2String(ListNode *head) {
	if (head==nullptr) return "[]";
    ListNode *p = head;
	string res;
    while (p != nullptr) {
        res.append(to_string(p->val));
        res.append("->");
        p = p->next;
    }
    res.append("null");
    return res;
}

int main()
{
	Solution s;
    vector<int> nums = {4,2,1,3};
    ListNode *head = buildNodeList(nums);
	cout << NodeList2String(head) << endl;
	head = s.sortList(head);
	cout << NodeList2String(head) << endl;
	
    nums = {-1,5,3,4,0};
    head = buildNodeList(nums);
	cout << NodeList2String(head) << endl;
	head = s.sortList(head);
	cout << NodeList2String(head) << endl;
	
	return 0;
}

输出:

4->2->1->3->null
1->2->3->4->null
-1->5->3->4->0->null
-1->0->3->4->5->null


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Sentinel 规则持久化配置】

Sentinel 规则持久化 Sentinel 规则持久化一、修改order-service服务1.引入依赖2.配置nacos地址 二、修改sentinel-dashboard源码1. 解压2. 修改nacos依赖3. 添加nacos支持4. 修改nacos地址5. 配置nacos数据源6. 修改前端页面7. 重新编译、打包项目8.启动 Sentinel 规则持久化 …

Vulfocus-struts2初了解

CVE-2013-2135 漏洞原理&#xff1a; 配置了通配符*&#xff0c;访问name.action时使用name.jsp来渲染页面&#xff0c;但是在提取name解析时&#xff0c;对其执行了OGNL表达式解析&#xff0c;所以导致了命令执行。如果一个请求与任何其他定义的操作不匹配&#xff0c;它将匹…

注意力机制之SGE Attention

论文 Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 论文链接 paper:Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 模型结构 论文主要内容 卷积神经网络&#xff08;CNN&a…

uboot的环境变量相关源码分析

一、uboot的环境变量基础 1.1、环境变量的作用 (1)让我们可以不用修改uboot的源代码&#xff0c;而是通过修改环境变量就可以影响uboot运行时的一些特性。譬如说修改bootdelay环境变量就可以更改系统开机自动启动时倒计时的秒数。 1.2、环境变量的优先级 环境变量的优先级高…

c++(日期类)

本章主要以日期类为例&#xff0c;练习重载各种运算符&#xff0c;需要重点掌握&#xff1a; 1、日期类的<、 <、 、>、 >、 !、重载 2、日期类的 、 、-、-、、--、重载 3、日期类 - 日期类 4、日期类的 << 、>>重载 5、权限问题 目录 1、运算符…

DOM事件(下)

事件执行机制 ●今天来聊一聊事件的执行机制 ●什么是事件的执行机制呢&#xff1f; ○思考一个问题&#xff1f; ○当一个大盒子嵌套一个小盒子的时候&#xff0c;并且两个盒子都有点击事件 ○你点击里面的小盒子&#xff0c;外面的大盒子上的点击事件要不要执行 事件的传播&…

ASEMI代理ADM706SARZ-REEL原装ADI车规级ADM706SARZ-REEL

编辑&#xff1a;ll ASEMI代理ADM706SARZ-REEL原装ADI车规级ADM706SARZ-REEL 型号&#xff1a;ADM706SARZ-REEL 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-8 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;8 工作温度:-40C~85C …

JavaWeb《后端内容:2. MVC-IOC-ServletContext-事务管理-过滤器Filter》

1. 准备和回顾 本篇基于上一篇JavaWeb《后端内容&#xff1a;1. Tomcat - Servlet - Thymeleaf》 继续使用mvc进行优化&#xff0c;复制上面模块的代码&#xff0c;并新建工件和项目和配置服务器 这里可以再好好复习揣摩一下这里index页面的逻辑部分&#xff0c;尤其是关键字的…

PostgreSQL类型系统——Data Types

PostgreSQL Data Types PostgreSQL has a rich set of native data types available to users. Users can add new types to PostgreSQL using the CREATE TYPE command. PostgreSQL有一组丰富的本地数据类型可供用户使用。用户可以使用CREATE TYPE命令向PostgreSQL添加新类型…

[Gitops--12]微服务项目发布

微服务项目发布 1. 微服务项目发布 [流水线] [创建] [下一步] [创建] 1.1 mall-gateway 确认项目中的路由配置都正确 mall-gateway/src/main/resources/application.yml如果不一样就批量替换一下,一共7处 1.2 mall-auth-server mall-auth-server1.3 mall-cart 1.4 mall-c…

ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)

ChatGLM-LLaMA-chinese-insturct 前言一、实验记录1.1 环境配置1.2 代码理解1.2.1 LoRA 1.4 实验结果 二、总结 前言 介绍&#xff1a;探索中文instruct数据在ChatGLM, LLaMA等LLM上微调表现&#xff0c;结合PEFT等方法降低资源需求。 Github: https://github.com/27182812/Ch…

Win10任务栏透明,3个超好用解决方法!

案例&#xff1a;win10任务栏透明怎么办&#xff1f; 【我的电脑不知道为什么任务栏突然就变透明了&#xff0c;现在不知道该如何解决&#xff0c;遇到这种情况应该怎么办呀&#xff1f;】 Win10任务栏是Windows 10操作系统的一部分&#xff0c;通常默认为不透明。然而&#…

asp.net+sqlserver企业公司进销存管理系统

基于WEB的进销存管理系统主要企业内部提供服务&#xff0c;系统分为管理员&#xff0c;和员工2部分。 在本基于WEB的进销存管理系统中分为管理员&#xff0c;和普通用户2中模式&#xff0c;其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息&#xff0c;以及员工…

堆栈溢出一般是什么原因?

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性&#xff1a; 最后一个放入堆栈中的物体总是被最先拿出来&#xff0c; 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素…

MySQL深度分页

1. 什么是深度分页 深度分页问题的本质是在 MySQL 数据库中&#xff0c;通过 LIMIT 和 OFFSET 关键字进行分页时&#xff0c;MySQL 需要在每次查询时扫描整张表&#xff0c;直到找到当前页的数据。这种查询方式需要进行大量的磁盘 I/O 和内存操作&#xff0c;导致查询效率非常…

Microsoft Edge新功能测评体验

Microsoft Edge使用体验 Microsoft Edge是一款现代化的浏览器&#xff0c;它拥有众多功能和强大的性能&#xff0c;为用户带来更加流畅的浏览体验。 Edge最近推出了分屏功能&#xff0c;支持一个窗口同时显示两个选项卡&#xff0c;这可以大大提高生产力和多任务处理能力。 一…

什么样的蓝牙耳机佩戴舒适?蓝牙耳机佩戴舒适度排名

越来越多的人开始使用运动蓝牙耳机了&#xff0c;不仅仅是因为蓝牙耳机的它无耳机线的束缚&#xff0c;日常还很便携&#xff0c;市面上的蓝牙耳机质量参差不齐&#xff0c;有些佩戴舒适度也比较差&#xff0c;下面整理了几款评分还不错的几款蓝牙耳机。 一、南卡小音舱Lite2蓝…

第四十四章 Unity 滑动条 (Slider) UI

本章节我们介绍滑动条 (Slider)&#xff0c;它允许用户通过拖动鼠标从预定范围中选择数值。首先&#xff0c;我们点击菜单栏“GameObject”->“UI”->“Slider”&#xff0c;调整其位置&#xff0c;最终效果如下 我们发现滑动条 (Slider)下面有三个子游戏对象Background&…

如何使DocuWare成为所有部门的数据中心

如何使DocuWare成为所有部门的数据中心 自动化流程通常需要多个部门的数据&#xff0c;而各个部门通常使用不同的软件。 DocuWare可帮助您集中管理所有信息&#xff0c;并将信息应用于您的进程和工作流程当中。 您的公司使用不同的系统&#xff0c;但您又想将这些数据整合在一…

手敲Mybatis(十)-完善ORM框架支持增删改查

我们把基本的功能都完成了&#xff0c;解析xml、构建映射代理、执行sql&#xff0c;解析处理结果&#xff0c;目前这些只支持查询&#xff0c;我们还差添加下增删改的功能&#xff0c;本章节就来完善下增删改&#xff0c;其实本章节比较简单&#xff0c;因为之前的每个章节都已…