leetcode面试题 02.07. 链表相交

面试题 02.07. 链表相交https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

双指针法

1. 两个链表都不为空时:

        设链表A的节点数为m,链表B的节点为n,两个链表相交的节点数为c,不相交的节点数分别为 a,b。

可以得到等式 a+c=m,b+c=n

定义两个指针pointA,pointB,分别指向headA,headB,两个指针分别遍历两个链表的所有节点。 

        1.1两个链表相交

  • 当a=b时,两个指针会同时到达相交的节点,此时返回相交的节点。
  • 当a≠b时,pointA会遍历完链表A,pointB会遍历完链表B。此时,pointA继续遍历链表B,pointB会继续遍历链表A。当pointA移动a+c+b次时,pointB移动b+c+a次时,两个指针同时指向相交的节点,返回相交的节点。

        1.2两个链表不相交

        两个链表不相交,则c=0

  • a=b时,两个指针同时指向null,则返回null
  • a≠b时,pointA会遍历完链表A和B,pointB会遍历完链表B和A,此时pointA移动的次数为m+n次,pointB移动的次数为n+m次。pointA和pointB同时指向null,此时返回null

2.两个链表有一个为空时返回null

最后附上代码

    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        if (headA==null || headB==null){
            return null;
        }
        //定义两个指针
        ListNode pointA=headA;
        ListNode pointB=headB;
        while (pointA!=pointB){
            //pointA遍历链表A和B
            pointA=pointA==null?headB:pointA.next;
            //pointB遍历链表B和A
            pointB=pointB==null?headA:pointB.next;
        }
        return pointA;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值