leetcode160相交链表

本文主要讲解相交链表的要点与细节

c++及java代码如下,末尾

1.两个链表相交的条件是,两个节点的指针相同,而不是元素值相同,即

if(a==b) return a;

2.·既然要找到相交的点,那么相交之后,两个链表就完全一样了(后续长度和数值),那么我们就要不断同步更新headA和headB的临时指针,直到满足相交条件。

a=a->next;
b=b->next;

3.但是由于两个链表的长度不一致,不能一上来就同步更新,他们原本存在长度差,导致相交点是不对齐的。所以我们需要先移动较长链表的临时指针,让他们尾部对齐,再开始同步更新。


4.小细节:由于不知道具体测试例中,两个链哪个是长的,所以要找一下长的。可以把长的交换给a链,省去后续分情况讨论


c++代码如下

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

java代码如下

class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode a = headA;
        ListNode b = headB;
        int a_n = 0;
        int b_n = 0;
        //计算a链长度
        while (a != null) {
            a_n++;
            a = a.next;
        }
        //计算b链长度
        while (b != null) {
            b_n++;
            b = b.next;
        }

        a = headA;
        b = headB;

        //如果a是短链,那么把b交换给a
        if (a_n < b_n) {
            //1. swap (lenA, lenB);
            int tmpLen = a_n;
            a_n = b_n;
            b_n = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = a;
            a = b;
            b = tmpNode;
        }

        //长度差
        int diff = a_n - b_n;

        //移动a到对应位置
        while (diff != 0 && a != null) {
            a = a.next;
            diff--;
        }
        //判断是否相交
        while (a != null) {
            if (a == b) return a;
            a = a.next;
            b = b.next;
        }
        return null;
    }
}

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值