数据结构算法经典题目刨析(c语言)相交链表求交点(图文详解)

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

 一.题目描述:

二、解题思路

方法一:双循环对比法

 方法一实现代码

方法二: 双指针法 

方法二实现代码 


 一.题目描述:

二、解题思路

方法一:双循环对比法

  • 时间复杂度O(n^2)       空间复杂度O(1)
  • 链表A中的节点依次与链表B中的每个节点比较
  • 若出现节点相同,则相交且为第一个交点
  • 若链表A走到空依然没有相同的节点,则不相交
  • 注意:暴力解法效率较低,不建议采用

 方法一实现代码

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

方法二: 双指针法 

1.时间复杂度O(n)           空间复杂度O(1)
2.首先遍历链表求出两个链表的长度,求得长度的差值
3.定义两个快慢指针,哪个链表长,快指针就指向哪个链表
4.两个指针分别从两个链表的第一个节点开始遍历,快指针先走出一个长度差值,之后两个指针每移动一步,比较指向的节点是否相同
5.若出现节点相同,则相交且为第一个交点
6.若两个指针走到空依然没有相同的节点,则不相交

方法二实现代码 、

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if (headA == NULL || headB == NULL) {
        return NULL; // 处理空链表情况
    }

    struct ListNode *pcurA = headA, *pcurB = headB;
    int countA = 0, countB = 0;

    // 计算链表A的长度
    while (pcurA != NULL) {
        countA++;
        pcurA = pcurA->next;
    }
    // 计算链表B的长度
    while (pcurB != NULL) {
        countB++;
        pcurB = pcurB->next;
    }

    // 重新指向头节点
    pcurA = headA;
    pcurB = headB;

    // 让较长链表的指针先移动差值步
    if (countA > countB) {
        int diff = countA - countB;
        while (diff--) {
            pcurA = pcurA->next;
        }
    } else {
        int diff = countB - countA;
        while (diff--) {
            pcurB = pcurB->next;
        }
    }

    // 同步移动直到找到交点
    while (pcurA != pcurB) {
        pcurA = pcurA->next;
        pcurB = pcurB->next;
    }

    return pcurA; // 返回交点或NULL
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值