【Leetcode刷题笔记】 160. Intersection of Two Linked Lists

在这里插入图片描述
题目思路:求两个链表是否存在交集。
交集:在当前节点到最后节点的所有值都相同
首先只能想到比较笨的暴力方法:在A和B的所有节点,遍历到最后的节点,判断是否相同。
参考了一些博客之后:
博客
明白了隐含条件,如果两个链表长度不一样时,那么交集点肯定存在在长度差的地方。
于是也就有了
解决方法1:首先求出两个链表长度,并且将较长的链表进行后移,知道达到长度相同的点。然后开始判断两个链表节点是否相同,如果相同,那么肯定当前点为交点。
解决方法2:是上面方法的一种更加智慧的方式,在链表A和B长度不同的时候,不是进行长度计算和后移到相同点,而是直接进行后移。
例如:当A后移到null点时,接到B上。当B后移到null时,接到A上。这样也就变相解决了长度不同的问题,相当与将A和B拼接起来进行判断,那么当A当前节点==B当前节点时,也就是跑到对面节点上,找到交集。
方法1:

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    //如果两个链表存在着交集,那么两个链表的长度差时,值肯定是一样的
    ListNode *p1 = headA;
    ListNode *p2 = headB;
    int l1 = getlen(p1);
    int l2 = getlen(p2);
    int l = l1>l2?l1-l2:l2-l1;
   // cout<<l1<<" "<<l2<<" "<<l<<endl;
    if(l1>l2){
        while(l>0){
            p1 = p1->next;
            l--;
        }
    }else{
        while(l>0){
            p2 = p2->next;
            l--;
        }
    }
    while(p1&&p2){
        if(p1==p2){
            return p1;
        }else{
            p1=p1->next;
            p2=p2->next;
        }
    }
    return NULL;
}
int getlen(ListNode *p){
    int len = 0;
    while(p){
        len++;
        p = p->next;
    }
    return len;
}

方法2:

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    ListNode *p1 = headA;
    ListNode *p2 = headB;
    while(p1!=p2){
        p1 = p1?p1->next:headB;
        p2 = p2?p2->next:headA;
    }
    return p1;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值