打卡 DAY 13 链表相交

力扣原题链接

一、题目描述

二、思路

  • 分别对A链表和B链表设置虚拟头节点pA、pB;
  • 循环得出两个链表的长度lenA、lenB,计算差值len然后让长度较大的移动到第(len + 1)个节点,继而让两个指针同时移动,并判断(p -> next)的地址是否相同;
  • 若找得到,返回p -> next;若找不到,返回NULL;
  • 思路如下图:

 

三、解题过程

  • 计算链表长度

分别定义lenA和lenB与各自的虚拟头节点,遍历链表:

    int lenA = 0;
    int lenB = 0;
    struct ListNode* pA = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* pB = (struct ListNode*)malloc(sizeof(struct ListNode));
    pA -> next = headA;
    pB -> next = headB;
    for(; headA; lenA ++) headA = headA -> next;
    for(; headB; lenB ++) headB = headB -> next;
  • 移动较长链表的指针

移动较长链表指针的位置至与较短链表指针为逆序的同一位置:

    struct ListNode* longIndex = lenA > lenB ? pA : pB;
    struct ListNode* shortIndex = lenA < lenB ? pA : pB;
    int len = lenA > lenB ? lenA - lenB : lenB - lenA;
    for(; len; len --) {
        longIndex = longIndex ->next;
    }
  • 寻找相交点

    while(longIndex -> next != shortIndex -> next){
        longIndex = longIndex -> next;
        shortIndex = shortIndex -> next;
    }
  • 返回相交的起始节点

    return longIndex -> next;

四、代码

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int lenA = 0;
    int lenB = 0;
    struct ListNode* pA = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* pB = (struct ListNode*)malloc(sizeof(struct ListNode));
    pA -> next = headA;
    pB -> next = headB;
    for(; headA; lenA ++) headA = headA -> next;
    for(; headB; lenB ++) headB = headB -> next;
    struct ListNode* longIndex = lenA > lenB ? pA : pB;
    struct ListNode* shortIndex = lenA <= lenB ? pA : pB;
    int len = lenA > lenB ? lenA - lenB : lenB - lenA;
    for(; len; len --) {
        longIndex = longIndex ->next;
    }
    while(longIndex -> next != shortIndex -> next){
        longIndex = longIndex -> next;
        shortIndex = shortIndex -> next;
    }
    return longIndex -> next;
}

时间复杂度:O(m + n),空间复杂度:O(1)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值