我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++相交链表和反转链表详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++相交链表和反转链表详解

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

在这里插入图片描述

思路

简单来说,就是求两个链表交点节点的 指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

在这里插入图片描述

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

在这里插入图片描述

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。

否则循环退出返回空指针。



class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA=headA;
        ListNode* curB=headB;
        int lenA=0;
        int lenB=0;
        while(curA!=nullptr){  // 求链表A的长度
            lenA++;
            curA=curA->next;
        }
        while(curB!=nullptr){  // 求链表B的长度
            lenB++;
            curB=curB->next;
        }
        //现在的curA,curB已经指向最后一个节点了,需要重新指向头结点
        curA=headA;
        curB=headB; 
        if(lenA<lenB){  //假设链表A的长度大于链表B,否则交换
            swap(lenA,lenB);
            swap(curA,curB);
        }
        //gap是两个链表长度的差值
        int gap=lenA-lenB; // gap=lenA-lenB 错误,要有返回类型
        while(gap){     // 让curA和curB在同一起点上(末尾位置对齐)
            gap--;
            curA=curA->next;  
        }
        while(lenB){   // 遍历curA 和 curB,遇到相同则直接返回
            if(curA==curB)
                return curA; // return curA(val) 返回节点中的值,这个写法是错误的  直接return curA
            curA=curA->next;
            curB=curB->next;
            lenB--;
        } 
        return nullptr;  //没有交点则返回空
    }
};

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

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

输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]

输出:[2,1]

示例 3:

输入:head = []

输出:[]

双指针思路

首先判断链表是否为空,为空则返回nullptr。

接下来定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。

然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。

最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。



class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr)  //对空链表的判断
            return nullptr;
        ListNode* per=nullptr;
        ListNode* cur=head;
        ListNode* temp; //建立一个指针
        while(cur){  //没必要写 while(cur!=nullptr),写了这个还要判断cur,会浪费时间,直接cur就可以
            temp=cur->next; //保存cur的下一个节点
            cur->next=per; //cur的下一个节点指向per,实现反转
            per=cur;  //cur=per;错误,是把cur的节点赋值给per
            cur=temp; //temp=cur;错误,是把temp(原来的cur->next)的节点赋值给cur
        }
        return per;
    }
};

递归



class Solution {
public:
    ListNode* reverse(ListNode* per,ListNode* cur){  //返回的是一个链表,其返回值是指针
        if(cur==nullptr)  //递归的终止条件
            return per;
        ListNode* temp=cur->next;
        cur->next=per;
        return reverse(cur,temp); // 调用要写return
    }
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr) //链表判空
            return nullptr; 
        return reverse(NULL,head); // 调用要写return
    }
};

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++相交链表和反转链表详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

web数组与链表到单链表的反转怎么理解

本篇内容主要讲解“web数组与链表到单链表的反转怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web数组与链表到单链表的反转怎么理解”吧!数组与链表数组最大的一个特点就是,需要一块连续的
2023-06-16

C++实现反转链表的两种方法

本文主要介绍了C++实现反转链表的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-09

c语言单链表反转代码怎么写

以下是一个简单的C语言单链表反转代码示例:#include #include // 定义链表节点结构体typedef struct Node {int data;struct Node* next;} Node;// 添加节点到链表
2023-10-26

Golang判断两个链表是否相交的方法详解

这篇文章主要为大家详细介绍了如何通过Golang判断两个链表是否相交,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-14

C语言学习之链表的实现详解

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。这篇文章主要介绍了C语言中链表的实现,需要的可以参考一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录