【数据结构与算法 经典例题】相交链表求交点

简介: 【数据结构与算法 经典例题】相交链表求交点

一、问题描述

160. 相交链表 - 力扣(LeetCode)

如下图所示

二、解题思路

方法一:双循环对比法

  • 时间复杂度O(n^2)       空间复杂度O(1)

  • 链表A中的节点依次与链表B中的每个节点比较
  • 若出现节点相同,则相交且为第一个交点
  • 若链表A走到空依然没有相同的节点,则不相交

注意:暴力解法效率较低,不建议采用

方法二: 双指针

  • 时间复杂度O(n)           空间复杂度O(1)

  • 首先遍历链表求出两个链表的长度,求得长度的差值
  • 定义两个快慢指针,哪个链表长,快指针就指向哪个链表
  • 两个指针分别从两个链表的第一个节点开始遍历,快指针先走出一个长度差值,之后两个指针每移动一步,比较指向的节点是否相同
  • 若出现节点相同,则相交且为第一个交点
  • 若两个指针走到空依然没有相同的节点,则不相交

三、C语言代码实现

方法一实现代码

 struct ListNode 
{
    int val;
    struct ListNode *next;
};
 
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    ListNode*pcurA=headA;
    ListNode*pcurB=headB;
    while(pcurA)
    {
        pcurB=headB;
        while(pcurB)
        {
            if(pcurA==pcurB)
                return pcurA;
            pcurB=pcurB->next;
        }
        pcurA=pcurA->next;
    }
    return NULL;
}

方法二实现代码

 struct ListNode 
{
    int val;
    struct ListNode *next;
};
 
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
   ListNode*pcurA=headA;
   ListNode*pcurB=headB;
   int countA=0;
   int countB=0;
   while(pcurA)//求出链表长度
   {
        pcurA=pcurA->next;
        countA++;
   }
   while(pcurB)
   {
        pcurB=pcurB->next;
        countB++;
   }
   int tmp=abs(countA-countB);//长度差值
   ListNode*slow,*fast;
   if(countA<countB)
    {
        slow=headA;
        fast=headB;
    }
    else
    {
        slow=headB;
        fast=headA;
    }
    while(tmp--)//长链表先走差值的步数
    {
        fast=fast->next;
    }
    while(fast&&slow)//同步比较
    {
        if(fast==slow)
            return fast;
        fast=fast->next;
        slow=slow->next;
    }
    return NULL;
}

 

相关文章
|
3月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
10月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
10月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
11月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
87 1
|
11月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
137 0
数据结构与算法学习五:双链表的增、删、改、查
|
11月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
160 0
|
11月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
93 0
|
11月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
625 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
402 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍

热门文章

最新文章