如何判断两个有环链表是否相交

本文介绍了一种判断两个有环链表是否相交的方法,并提供了详细的思路与代码实现。首先,通过检查两个链表的入环节点是否相同来简化问题,然后通过遍历确定相交点。

如何判断两个有环链表是否相交

问题

​ 如何判断两个有环链表是否相交,相交则返回第一个相交节点,不相交则返回null。

思路

​ 我们已经得到了两个链表各自的第一个入环节点,假设链表1的第一个入环节点为loop1,链表2的第一个入环节点为loop2。具体如下:

​ 1.如果loop1 == loop2,拓扑结构如图:

在这里插入图片描述

​ 该情况下,考虑链表1从头开始到loop1这一段与链表2从头开始到loop2这一段,在哪里第一次相交即可。这与判断两个无环链表是否相交类似,只是这里把loop1(loop2)作为判断终止条件。

​ 2.如果loop1 != loop2,两个链表不相交的拓扑结构如图:

case1case2
在这里插入图片描述在这里插入图片描述

​ 需要分辨是哪种情况,进入步骤3。

​ 3.让链表1从loop1出发,因为loop1和之后节点都在环上,所以将来一定能回到loop1。如果回到loop1之前并没有遇到loop2,那么将是case1,也就是不相交,返回null。否则是case2,也就是相交。因为loop1和loop2都在两条链表上,此时返回loop1或loop2都可以。

代码

public Node bothLoop(Node head1, Node loop1, Node head2, Node loop2){
    Node cur1 = null;
    Node cur2 = null;
    if (loop1 == loop2){
        cur1 = head1;
        cur2 = head2;
        int n = 0;
        while (cur1 != loop1){
            n++;
            cur1 = cur1.next;
        }
        while (cur2 != loop2){
            n--;
            cur2 = cur2.next;
        }
        cur1 = n > 0?head1:head2;
        cur2 = cur1 == head1?head2:head1;
        n = Math.abs(n);
        while (n != 0){
            n--;
            cur1 = cur1.next;
        }
        while (cur1 != cur2){
            cur1 = cur1.next;
            cur2 = cur2.next;
        }
        return cur1;
    } else {
      cur1 = loop1.next;
        while (cur1 != loop1){
            if (cur1 == loop2){
                return loop1;
            }
            cur1 = cur1.next;
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值