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

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

一、问题描述

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;
}

 

相关文章
|
1月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
45 0
|
1月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
43 0
|
18天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
18天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
1月前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)
|
1月前
|
算法 索引
经典算法之链表篇
经典算法之链表篇
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
17 1
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。