单链表在线OJ题二(详解+图解)

简介: 单链表在线OJ题二(详解+图解)
1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针

本题的意思是要删除链表中重复出现的节点,然后返回删除重复节点后的链表。

我们可以直接用一个哨兵位以便于观察链表的情况,然后用前后指针来解决这个问题。如果当前节点cur的值与其当前节点的next的所存储的值相等(且cur的next不为空),cur就变成cur的next,然后用while循环进行判断,如果cur的val与cur的next的val相等且cur的next不为空,就然后cur往后移动,直到遇到不相同的情况,跳出循环后cur还要记得移动到cur的next;然后再将前指针prev的next置为cur,这样就可以将相等的节点省略。当cur的next为空或者cur的值与cur的next的值不相等时,就直接先将prev置为cur,再将cur往后移动变成cur的next。最后返回哨兵位vpead的next,就是存储了有效数据的首节点,就可以返回整个删除后的单链表了。

完整代码如下:

struct ListNode *deleteDuplication(struct ListNode *pHead)
{
    struct ListNode *vHead;
    vHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    vHead->next = pHead;
    //定义虚头结点方便边界情况讨论
    struct ListNode *pre, *cur;
    pre = vHead, cur = pHead;
    while (cur)
    {
        if (cur->next && cur->val == cur->next->val)
        {
            cur = cur->next;
            while (cur->next && cur->val == cur->next->val)
                cur = cur->next;
        //当遇到与下一节点值相同时,cur推进到最后一个重复的数字处
        //本数字舍去,pre连接到下一个
            cur = cur->next;
            pre->next = cur;
        }
        //遇到与下一节点值不同或者是没有下一节点时,pre移动到此处,cur继续后移
        else if(!cur->next || cur->val != cur->next->val)
        {
            pre = cur;
            cur = cur->next;
        }
    }
    return vHead->next;
}
2.对链表进行插入排序

本题也要使用到哨兵位,用哨兵位的next最后可以返回排序完后的链表,并且使用前后指针,进行大小比较,若是逆序则用前后指针的关系进行交换即可

完整代码如下:

struct ListNode *insertionSortList(struct ListNode *head) 
{
    if (head == NULL) 
        return head;
    struct ListNode *dummyHead = malloc(sizeof(struct ListNode));
    dummyHead->val = 0;
    dummyHead->next = head;//哨兵位
    struct ListNode *lastSorted = head;
    struct ListNode *curr = head->next;
    while (curr != NULL) {
        if (lastSorted->val <= curr->val) 
        {
            lastSorted = lastSorted->next;
        } 
        else 
        {
            struct ListNode *prev = dummyHead;
            while (prev->next->val <= curr->val) 
            {
                prev = prev->next;
            }
            lastSorted->next = curr->next;
            curr->next = prev->next;
            prev->next = curr;
        }
        curr = lastSorted->next;
    }
    return dummyHead->next;
}
3.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

本题的意思很简单,就是一个判断链表是否有环的问题,如果有环就返回那个节点,看图就明白了,就是最后一个节点的next会连接到前面的节点,就是有环。

到这里我们就要有一个大概的思路了–快慢指针!

我们用慢指针slow一次走一步,fast一次走两步,到最后他们就一定会相遇,因为他们移动的差距只有一步一次追一步就必然会相遇。当slow和fast相遇时,我们再定义一个新指针从头节点开始往后移动,同时将slow或者fast往后移动,当这个新指针与slow或者fast相等时这个节点就返回这个节点,这个节点就是链表尾链接到链表的节点。

完整代码如下:

struct ListNode* detectCycle(struct ListNode* head) 
{
    struct ListNode *slow = head, *fast = head;
    while (fast != NULL) 
    {
        slow = slow->next;
        if (fast->next == NULL) 
        {
            return NULL;
        }
        fast = fast->next->next;
        if (fast == slow) 
        {
            struct ListNode* ptr = head;
            while (ptr != slow) 
            {
                ptr = ptr->next;
                slow = slow->next;
            }
            return ptr;
        }
    }
    return NULL;
}
4.给定一个链表,判断链表中是否有环

有了上一题的思路,这一题就很简单了,让slow指针和fast指针分别往后移动,slow一次走一步,fast一次走两步,如果二者能相遇(相遇即slow指针会与fast指针相等),那就是链表中有环,否则无环;

完整代码如下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
            return true;
    }
    return false;
}
5.输入两个链表,找出它们的第一个公共结点

其实这一题也很简单

首先我们得判断这个链表是否会相交,如果相交,那么两个链表的尾节点就会相等,若不想等就直接返回NULL指针

其次我们分别求两个链表的长度,用tail尾指针遍历求出lenA,lenB

然后我们用lenA-lenB相减的绝对值就能得出两个链表的长度差gap,让长的链表先走gap步,然后短的链表再和长的链表一起走,当两个链表的指针节点相等时,这个节点就是两个链表相遇的节点,返回这个节点即可

完整代码如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* tailA=headA;
    struct ListNode* tailB=headB;
    int lenA=1;
    int lenB=1;
    while(tailA)
    {
        tailA=tailA->next;
        lenA++;
    }
    while(tailB)
    {
        tailB=tailB->next;
        lenB++;
    }
    if(tailA!=tailB)
    {
        return NULL;
    }
    int gap=abs(lenA-lenB);
    struct ListNode* longlist=headA;
    struct ListNode* shortlist=headB;
    if(lenA<lenB)//若长链表尾b则互换
    {
        longlist=headB;
        shortlist=headA;  
    }
    while(gap--)
    {
        longlist=longlist->next;
    }
    while(longlist!=shortlist)
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;
}

我们再OJ题的解题中可以发现,快慢指针的解题思路是非常重要的,大家可以多去做一点题 !

好了,今天的分享到这里就结束了,谢谢大家的支持!

相关文章
|
27天前
|
数据采集 人工智能 自然语言处理
生成式引擎优化(GEO):当品牌开始争夺AI答案里的位置
过去二十年争搜索排名,如今用户直接向AI提问获取答案。生成式引擎优化(GEO)应运而生:通过权威引用、真实数据与专家引语提升内容在AI答案中的可见度(实测+30%–40%),而关键词堆砌反致-10%。GEO非SEO升级,而是适配RAG机制、以“可信信源”为目标的新范式。
|
1月前
|
存储 弹性计算 固态存储
阿里云服务器租用价格表2026年10月最新:一年/按月/按小时收费明细,一文看懂
2026年10月阿里云服务器最新报价:轻量应用服务器低至38元/年(200M峰值带宽),ECS经济型e实例99元/年;支持包年包月、按量付费及抢占式实例;含CPU内存、带宽(1–5Mbps起)、ESSD云盘等分项计费明细。
361 0
|
8月前
|
存储 缓存 安全
【HashMap】HashMap 系统性知识体系全解(附《HashMap 面试八股文精简版》)
本文以JDK8为核心,对比JDK7差异,从基础认知、底层结构(数组+链表+红黑树)、哈希函数、扩容机制、线程安全、最佳实践及面试考点七大维度,系统解析HashMap原理与应用,助你构建完整知识体系。
|
3月前
|
人工智能 自然语言处理 API
从入门到精通阿里云千问:模型矩阵、免费额度、API代码调用与企业落地指南
AI产业落地的浪潮下,自研通用大模型已经成为数字化转型的核心基础设施。阿里云千问,官方名称通义千问,代号Qwen,是阿里云完全自主研发的全栈式大模型家族,并非单一文本模型,而是覆盖纯文本、代码、图像、音频、视频、行业垂直场景的完整产品矩阵,统一依托阿里云百炼大模型服务平台对外提供模型调用、微调、智能体开发、私有知识库构建、应用一键部署等全链路MaaS服务。当前主力迭代版本为Qwen3.7系列,形成旗舰、均衡、轻量、多模态、代码专用五大分支模型,在中文理解、超长上下文推理、自主智能体执行、多模态统一解析四大维度具备国产头部水准,同时搭配免费试用、按量计费、Token Plan订阅、长期节省计划四
1466 4
|
3月前
|
弹性计算 监控 网络协议
阿里云轻量应用服务器200M带宽是真的吗?峰值带宽解析与选择注意事项说明
阿里云轻量应用服务器以"200M峰值带宽"和高性价比吸引了大量个人开发者及中小企业用户,但该带宽实为共享型峰值带宽而非独享保障,受资源争抢、双向共享限制及无SLA保障等因素制约,实际可用带宽往往低于标称值。文章深入解析了其技术逻辑,指出该产品适用于小型Web、博客、开发测试等轻量场景,不适合高网络质量要求的业务。同时,文章就高峰期带宽受限、异常流量、跨境路由等实际挑战提供了应对策略,并给出了性能验证、优化配置及升级ECS等建议,帮助用户理性选型、合理规划云资源。
|
7月前
|
人工智能 API 网络安全
2026年阿里云轻量服务器部署 OpenClaw 图文教程|iMessage集成+千问Qwen3.6-Plus配置+常见问题解答
2026年,开源AI智能体框架OpenClaw(曾用名Clawdbot,社区昵称“龙虾AI”)凭借轻量化、强执行、多平台适配的特性,成为搭建专属AI助手的首选方案。它突破传统AI“仅能对话”的局限,实现“自然语言指令→任务规划→自动执行→结果反馈”的完整闭环,覆盖办公自动化、消息处理、跨平台协作等多元场景。
606 11
|
7月前
|
存储 算法 关系型数据库
向量相似性搜索详解:Flat Index、IVF 与 HNSW
向量搜索解决非结构化数据(如文本、音频)的语义检索难题。关系型数据库擅长精确匹配结构化数据,而向量数据库通过Embedding将语义转化为向量,并利用余弦相似度、Flat Index、IVF、HNSW等算法实现高效近邻搜索,兼顾精度与速度。
529 0
向量相似性搜索详解:Flat Index、IVF 与 HNSW
|
7月前
|
人工智能 Linux API
从0到1玩转OpenClaw(小龙虾AI):阿里云部署+本地搭建+API配置+避坑全解
2026年,开源AI智能体框架OpenClaw(曾用名Clawdbot、Moltbot,因Logo形象被用户亲切称为“小龙虾AI”)已成为现象级工具。它打破传统AI“仅能对话”的局限,通过大模型驱动与技能扩展,实现“自然语言指令→任务规划→自动执行→结果反馈”的完整闭环,覆盖办公自动化、文件处理、跨平台协作等全场景需求。
1150 4
|
8月前
|
Web App开发 人工智能 搜索推荐
AI 技术在英语学习的应用
AI正重塑英语学习:从工具升级为全场景数字导师。依托原生多模态大模型与智能体技术,实现五大突破——毫秒级情感化对话、AR实景沉浸训练、长效个性化知识图谱、音素级3D发音诊断、低成本高精度中高考适配,让优质英语教育真正普惠可及。(239字)
|
安全 Ubuntu 网络安全
本地服务器 Odoo 安装指南,并实现公网访问
本指南详细介绍基于 Odoo 的企业应用部署流程。首先通过 VMware 安装虚拟机并配置 Ubuntu 系统,为运行环境打下基础;接着利用 Websoft9 平台简化中间件与 Odoo 服务的安装,实现快速部署与版本管理;然后借助 cpolar 实现内网穿透并完成域名解析,确保公网访问畅通;最后进行功能测试与性能优化,提供运维建议以保障系统稳定性和安全性。适合初学者及中小型企业参考实施。
1483 4