当前位置: 首页 > article >正文

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

题目

在这里插入图片描述

解析

题目要求

  1. 如果相交 就返回交点
  2. 如果不相交 就返回NULL

思路

1.通过题目的描述我们可以知道,两个单链表相交只有一种形式
在这里插入图片描述

并不存在下面的的形式
在这里插入图片描述
我们已经明确了单链表相交的形式, 那我们要如何判断两个单链表相交呢
这里给出一种做法,如果两个单链表相交,那么它们的最后一个元素肯定是一样的
如上图,所以我们可以写出这样的代码来判断他们相不相交
这一步是找出最后的那个元素

while(tailA != NULL)   // tailA 是指向单链表A头节点的指针
{
  tailA = tailA->next;
}
while(tailB != NULL)   // tailB 是指向单链表B头节点的指针
{
  tailB = tailB->next;
}

这一步是判断最后的元素相不相等

if( tailA != tailB)
{
  return NULL;
  }

如果相等就说明这两个单链表是相交的 就可以进入下一步了
即: 如何返回第一个相交的交点?
分析:
如果这两个单链表的长度是相同的话,(假设这两个单链表是A,B),要找第一个相交的点就简单的多,直接让A的指针(指向头节点的)和B的指针(指向头节点的)一起走,边走边判断,如果不相等就继续走,如果相等就可以停下来返回当前节点的地址了。在这里插入图片描述
如图A B 都走三步就到达 交点了
可是,一般情况下,这两个链表的长度都不相等,那咋办?
不相等就把它变成相等的嘛,让长的那个链表多走几步,走到和短的链表一样长,然后两个链表在一起走,这样就行了。
所以我们还要比较链表的长度还要算出长了多少

看代码

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)\
{
    //替身
    struct ListNode *tailA = headA;
    struct ListNode *tailB = headB;
    //计数
    int lenA = 1, lenB = 1;
   //找尾
   while(tailA != NULL)
   {
       tailA = tailA->next;
       ++lenA;
   }
    while(tailB != NULL)
    {
        tailB = tailB->next;
        ++lenB;
    }
   if(tailA != tailB)
   return NULL;
   //确定谁长
   struct ListNode* longList = headA;
   struct ListNode* shortList = headB;
   if(lenA < lenB)
   {
      longList = headB;
      shortList = headA;
   }

   //长的多走几步
   int gap = abs(lenA-lenB);   //abs 是求绝对值的
   while(gap--)
   {
       longList = longList->next;
   }
  //然后两个一起走找相等的
  while(longList != shortList)
  {
      longList = longList->next;
      shortList = shortList->next;
  }
  
   return longList;
}

http://www.kler.cn/news/17030.html

相关文章:

  • 2.6 浮点运算方法和浮点运算器
  • c++ 入门概述
  • WEB攻防通用漏洞跨域CORS资源JSONP回调域名接管劫持
  • CSS布局基础(CSS书写顺序 导航栏写法 常见问题)
  • SQL 语句性能优化策略
  • 【谷粒商城之消息队列RabbitMQ】
  • nullptr和NULL的区别
  • Photoshop如何使用选区之实例演示?
  • Java中顺序表详解
  • 自动驾驶行业观察之2023上海车展-----智驾供应链(1)
  • E. Train Hard, Win Easy(数学推导 + 前缀和)
  • JAVA-实现简易图书管理系统
  • leetcode 面试题 02.04. 分割链表
  • YonLinker连接集成平台构建新一代产业互联根基
  • babysql
  • JavaWeb学习------Servlet
  • Java基本数据类型以及包装类型的常量池技术
  • Java中线程池的介绍、构造方法及优势
  • 电子工程师是怎么练成的
  • 数据结构与算法之链表: Leetcode 141. 环形链表 (Typescript版)
  • 谷粒商城二十四Sentinel限流熔断降级
  • 用于scATAC-seq有监督分类的Cellcano
  • 【LeetCode刷题记录】数组专题
  • Python小姿势 - Python面向对象
  • 《基于深度学习模型的非接触式面部视频记录技术用于心房颤动的检测》阅读笔记
  • 「Codeforces」B. Avoid Local Maximums
  • Redis之五大基本的数据类型:字符串String 散列hashes 列表 lists 集合sets 有序集合sorted sets 基础命令讲解
  • 学生台灯什么牌子好对眼睛好?专业护眼灯的学生台灯分享
  • 【AI工具】bing chat 使用--三种模式+撰写功能
  • gradle Task 详解