C语言中链表经典面试题目

news2024/11/20 14:33:34

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

链表分割

链表的回文结构 

相交链表


 

链表分割

描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

自测输入:

        {1,1,3,2,4},2

实际输出

        {1,1,3,2,4}

自测输入:

        {1,1,3,1,4},2

实际输出

        {1,1,1,3,4}

解题思路:

整体思路是,创建两个头指针head和phead,head连接小于x的节点,phead连接大于等于x的节点,最后head连接的尾节点指向phead连接的头节点。

class Partition 
{
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
        if(pHead==NULL)
        {
            return NULL;
        }
        // write code here
        ListNode* head=NULL;
        ListNode* n1=NULL;
        ListNode* phead=NULL;
        ListNode* n2=NULL;
        ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                if(head==NULL)
                {
                    head=n1=cur;
                }
                else 
                {
                    n1->next=cur;
                    n1=n1->next;
                }
                cur=cur->next;
            }
            else 
            {
                if(phead==NULL)
                {
                    phead=n2=cur;
                }
                else 
                {
                   n2->next=cur;
                   n2=n2->next;
                }
                cur=cur->next;
            }
        }
        if(n2!=NULL)
        {
            n2->next=NULL;
        }
        if(head==NULL)
        {
            return phead;
        }
        n1->next=phead;
        return head;
    }
};

链表的回文结构 

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 

测试样例: 

1->2->2->1
返回:true

解题思路:

找到链表的中间节点,然后将中间节点包括以后的节点进行逆置,逆置后得到一个头指针,然后依次判断原头指针连接的节点的值和现在得到的头指针连接的节点的值进行比较。这里不需要担心,链表的节点数的奇偶性。

#include <cstddef>
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A)
     {
        // write code here
        ListNode* cur=A;
        int count =0;
        while(cur)
        {
            cur=cur->next;
            count++;
        }
        int num=count/2;
        ListNode* tail=A;
        ListNode* prev=NULL;
        ListNode* head=NULL;
        ListNode* n1=A;
        while(num)
            {
                num--;
                tail=tail->next;
            }
            n1=tail;
            prev=tail->next;
            while(n1)
            {
                n1->next=head;
                head=n1;
                n1=prev;
                if(prev!=NULL)
                {
                    prev=prev->next;
                }
            }
            while(head)
            {
                if(A->val!=head->val)
                {
                    return false;
                }
                head=head->next;
                A=A->next;
            }
            tail=NULL;
        return true;
    }
};


这里是将原来的,找中间节点和逆置的函数进行复用
// #include <cstddef>
// class PalindromeList {
// public:
// struct ListNode* reverseList(struct ListNode* head)
// {
//     if(head==NULL)
//     {
//         return NULL;
//     }
//     struct ListNode* n1=NULL;
//     struct ListNode* n2=head;
//     struct ListNode* n3=head->next;
//     while(n2)
//     {
//         n2->next=n1;
//         n1=n2;
//         n2=n3;
//         if(n3!=NULL)
//         {
//             n3=n3->next;
//         }
//     }
//     return n1;
// }
// struct ListNode* middleNode(struct ListNode* head)
// {
//     struct ListNode* cur=head;
//     int count=0;
//     while(cur)
//     {
//         cur=cur->next;
//         count++;
//     }
//     int num=count/2;
//     cur=head;
//     while(num--)
//     {
//         cur=cur->next;
//     }
//     return cur;
// }
// bool chkPalindrome(ListNode* A)
//    {
//         // write code here
//         ListNode* mid=middleNode(A);
//         ListNode* remid=reverseList(mid);
//         while(remid)
//         {
//             if(A->val!=remid->val)
//             {
//                 return false;
//             }
//             A=A->next;
//             remid=remid->next;
//         }
//         return true;
//    }
// };

相交链表
 

给你两个单链表的头节点 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 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

 

示例 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 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

 

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

解题思路:

判断两个链表是否相交的关键在于,两个链表的尾节点是否相等(这里指的是为节点的地址,而不是值),相等的话,则两个链表必定相交。如果相交的话,就需要找交点,找交点有两种方法,第一种(暴力求解):A链表所有节点跟B链表的所有节点比较一遍,相等的就是交点,但是时间复杂度为O(N*M)。第二种:分别得到两个链表的长度LA和LB,长的先走abs(LA-LB)步,然后两个同时走,第一个相等的就是交点。

//判断链表是否相交,重点在于判断节点的地址是否相等
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
  struct ListNode* tail1=headA;
  struct ListNode* tail2=headB;
  int lenA=1,lenB=1;
  while(tail1->next)
  {
      tail1=tail1->next;
      lenA++;
  }
  while(tail2->next)
  {
      tail2=tail2->next;
      lenB++;
  }
  //如果尾节点不相等,一定不相交
  if(tail1!=tail2)
  {
      return NULL;
  }
  //长先走差距步
  int gap=abs(lenA-lenB);
  struct ListNode* longList=headA;
  struct ListNode* shortList=headB;
  if(lenA<lenB)
  {
      longList=headB;
      shortList=headA;
  }
  while(gap--)
  {
      longList=longList->next;
  }
  while(longList!=shortList)
  {
      longList=longList->next;
      shortList=shortList->next;
  }
  return longList;
}

 

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   

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

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

相关文章

MySQL之Change Buffer详解

前言 本文已收录在MySQL性能优化原理实战专栏&#xff0c;点击此处浏览更多优质内容。 上一篇文章一文带你了解MySQL数据库InnoDB_Buffer_Pool&#xff08;点击跳转&#xff09;我们学习了InnoDB Buffer Pool的工作原理&#xff0c;其作用是减少MySQL读取数据时直接与磁盘打交道…

百趣代谢组学党参远志散对记忆障碍大鼠学习能力和肠道菌群的影响

文章标题&#xff1a;Effects of Dangshen Yuanzhi Powder on learning ability and gut microflora in rats with memory disorde 发表期刊&#xff1a;Journal of Ethnopharmacology 影响因子&#xff1a;5.195 作者单位&#xff1a;山西中医药大学 百趣提供服务&#xf…

什么是元宇宙数字展厅?元宇宙前景如何 ?

元宇宙是一个近年来备受关注的概念&#xff0c;它被认为是未来数字世界的新形态。元宇宙是一个虚拟的、数字化的世界&#xff0c;它可以模拟现实世界的各种物理、社会和经济系统&#xff0c;同时也可以融合人工智能、虚拟现实等前沿技术&#xff0c;为用户提供更加丰富、多样化…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料&#xff0c;既可以用于锂离子电池负极材料&#xff0c;又可以用于超级电容器电极材料&#xff0c;因而备受关注 。在作为锂离子电池负极材料时&#xff0c;具有较高的理论比容量&#xff0c;但充放电体积变化较大、材料导电性较差…

十、MyBatis的缓存

文章目录 十、MyBatis的缓存10.1 MyBatis的一级缓存场景1&#xff1a;判断同一个sqlSession是否查询1级缓存&#xff0c;答案&#xff1a;会查询1级缓存场景2&#xff1a;判断不同sqlSession是否查询1级缓存&#xff0c;答案&#xff1a;不会查询1级缓存场景3&#xff1a;判断相…

企业服务管理(ESM)工具

什么是企业服务管理 企业服务管理 (ESM) 是 IT 服务管理(ITSM)原则的延伸&#xff0c;旨在为人力资源 (HR)、法律、设施、营销和财务等业务团队提供更好的服务。ITSM 是 IT 团队管理向客户提供端到端 IT 服务的方式。ESM 的一个例子是建立一个可供整个组织所有团队使用的服务台…

LED显示屏周边设备

LED显示屏市场也呈多元化发展&#xff0c;异型屏、灯条屏、透明屏、小间距等应用新产品的出现无疑不是一种技术创新。以上创新技术的应用&#xff0c;对LED显示屏周边设备生产企业也提出了更高要求。因此&#xff0c;周边设备对推动整个LED显示屏的产业发展起着举足轻重、不可或…

【Linux-进程通信1】管道

&#x1f308;进程间通信介绍 &#x1f344;进程间通信目的 在操作系统中&#xff0c;每个进程都是独立运行的&#xff0c;它们有自己的地址空间和资源&#xff0c;它们不能直接访问其他进程的资源。然而&#xff0c;在现代计算机系统中&#xff0c;很少有一个进程能够独立完成…

yolov5读取单通道图像会怎样?

通过上图打印可知输入是固定3通道&#xff0c;那么意味着在读取图像中会对图像进行处理。 opencv在默认情况下会读取3个通道的图像&#xff0c;如果是灰度图会将图层复制三次(BGR缺省&#xff0c;BGR)&#xff0c;因此读出来的图片是三通道。

xcode打包导出ipa

转载&#xff1a;xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹果…

【Mybatis】Mybatis之xml开发—用户角色权限关联案例

目录 要求&#xff1a;使用xml开发完成需求查询。 数据库 需求 要求&#xff1a;使用xml开发完成需求查询。 数据库 -- 用户表 create table sys_user(user_id int primary key auto_increment comment 用户ID,user_name varchar(50) comment 用户名,password varchar(32)…

软件测试——性能指标

登录功能示例&#xff1a; 并发用户数500&#xff1b; 响应时间2S&#xff1b; TPS到500&#xff1b; CPU不得超过75%&#xff1b; 性能指标有哪些&#xff1f; 响应时间 并发用户数 TPS CPU 内存 磁盘吞吐量 网络吞吐量 移动端FPS 移动端耗电量 APP启动时间 性能…

windows11 安装多个mysql8

安装一个mysql请参考&#xff1a;windows系统安装mysql8 解压缩版安装顺序_csdn_aspnet的博客-CSDN博客 下载mysql&#xff1a;MySQL :: Download MySQL Community Server 下载后解压到你指定的目录&#xff0c;我下载的非最新版&#xff0c;如图&#xff1a; 在文件夹下面建一…

【SpringMVC】| 控制器异常处理机制及实现流程

MVC目录 一. &#x1f981; 前言二. &#x1f981; 控制器异常处理Ⅰ. 单个控制器异常处理Ⅱ. 全局异常处理Ⅲ. 自定义异常处理 三. &#x1f981; 最后 一. &#x1f981; 前言 咱们来探索一下控制器异常处理流程&#xff0c;以及如何来实现它。 二. &#x1f981; 控制器异…

烈日炎炎的夏天骑行,怎么预防中暑及中暑后怎么处理?

随着天气的逐渐炎热&#xff0c;夏季骑行逐渐成为了人们喜爱的一项运动。但是&#xff0c;在享受骑行乐趣的同时&#xff0c;我们也要时刻关注身体健康&#xff0c;预防中暑等意外情况的发生。下面&#xff0c;本文将从多个角度为大家讲解夏季骑行中暑的预防和处理方法。 一、选…

音频环回实验

音频环回实验 一、WM8978简介 WM8978是一个低功耗、高质量的立体声多媒体数字信号编译码器&#xff0c;它结合了一个高质量的立体声音DAC和ADC&#xff0c;带有灵活的音频线输入、麦克风输入和音频输出处理 WM8978内部有58个寄存器。每一个寄存器的地址位为7位&#xff0c;数…

SpringCloud基础知识

1、什么是SpringCloud SpringCloud分布式微服务架构的一站式解决方案&#xff0c;是多种微服务架构落地技术的集合体&#xff08;微服务全家桶&#xff09;。 查看官网&#xff1a;https://spring.io/ Spring Cloud本身不是新的框架&#xff0c;是一个全家桶式的技术栈&…

销售管理系统哪种好?

一、如何选择销售管理系统 销售管理软件其实就是我们常说的CRM软件&#xff0c;在激烈的市场竞争下&#xff0c;传统的销售管理模式不能满足有效跟进和及时维护客户的需求&#xff0c;在挖掘新客户和增强客户忠诚度方面也出现了一定弊端&#xff0c;因此销售管理软件应运而生&…

作者等级与权益说明

「创收计划」3.0上线&#xff0c;全面助力资源优质创作者 创&#xff1a;代表创作者收&#xff1a;代表收获 截止目前&#xff0c;文库资源频道已开放20细分领域&#xff0c;每个领域又进行详细的细分&#xff0c;在每个细分的品类上&#xff0c;我们已经收获了来自广大创作者…

基于AT89C51单片机的简易计算器的设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87755299?spm1001.2014.3001.5503 源码获取 本设计是以单片机AT89C51为核心的简易计算器设计&#xff0c;要通过芯片AT89C51实现计算器程序运行来完成加、减、乘…