leetcode 160.链表相交

⭐️ 往期相关文章

💫链接1:链表分割
💫链接2:链表中倒数第k个结点(快慢指针问题)
💫链接3:leetcode 876.链表的中间结点(快慢指针问题)
💫链接4:leetcode 206.反转链表
💫链接5:leetcode 203.移除链表元素
💫链接6:合并两个有序链表


⭐️ 题目描述

在这里插入图片描述
在这里插入图片描述
🌟 leetcode链接:链表相交

1️⃣ c代码:
思路:如果两个链表相交,则最后一个结点的地址是一样的。否则就是不相交。
但是要找到相交的结点,如果进入相交结点,则两个链表到终点的距离是一样的。但是没有进入相交的时候,可能是 A 链表长度长一些也可能是 B 链表长度长一些。所以要记录 A 链表和 B 链表到终点的长度。让长度小的链表先走差距步,这样两个链表距离相交的结点就是一样的距离了,然后遍历判断当前结点是否相等即可。相等结点就是相交点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

 /*
    思路:如果两个链表相交,则最后一个结点的地址是一样的。否则就是不相交
    但是要找到相交的结点,如果进入相交结点,则两个链表到终点的距离是一样的。但是没有进入相交的时候,
    可能是A链表长度长一些也可能是B链表长度长一些。所以要记录A链表和B链表到终点的长度。让长度小的链表
    先走差距步,这样两个链表距离相交的结点就是一样的距离了,然后遍历遍历判断当前结点是否相等即可。
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

    struct ListNode* tempHeadA = headA;
    struct ListNode* tempHeadB = headB;
    
    // 找A链表的尾结点
    int lengthA = 1;    // 由于是找尾结点所以lengthA的长度会少1 所以默认从1开始记录
    while (tempHeadA->next != NULL) {
        tempHeadA = tempHeadA->next;
        lengthA++;
    }

    // 找B链表的尾结点
    int lengthB = 1;
    while (tempHeadB->next != NULL) {
        tempHeadB = tempHeadB->next;
        lengthB++;
    }

    // 判断尾结点是否相同 不同则不相交
    if (tempHeadB != tempHeadA) {
        return NULL;
    }

    // 来到这里 A链表和B链表一定是相交的
    int gap = abs(lengthA - lengthB);

    // 假设 A长B短 lengthA > lengthB
    struct ListNode * longHead = headA;
    struct ListNode * shortHead = headB;
    // 否则 A短B长
    if (lengthB > lengthA) {
        longHead = headB;
        shortHead = headA;
    }

    // 先让 长的链表走差距步
    while (gap--) {
        longHead = longHead->next;
    }

    // 来到这里 A链表和B链表进入相交的距离一样
    // 若不相等就继续迭代往后走
    while (longHead != shortHead) {
        longHead = longHead->next;
        shortHead = shortHead->next;
    }

    // 来到这里说明 循环为假结束,A链表和B链表当前结点相等
    return shortHead;

}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值