判断链表是否相交并找出交点

问题概述

单链表定义如下:

  public class ListNode {
      int val;
      ListNode next;
      ListNode(int x) {
          val = x;
          next = null;
      }
 }

编写程序, 找出两个链表的交点
在这里插入图片描述
如图所示,链表 A 和链表 B 在节点 8 处相交。

算法思路

首先确定一个事情:

如果两个链表有交点, 那么这两个链表的尾节点一定是相等的。

现在不仅需要判断是否有交点, 还需要找出这个节点。继续观察图形, 可以得出,如果两个链表相交,那么较长链表在往后移动 ( ∣ l e n g t h 1 − l e n g t h 2 ∣ |length1-length2| length1length2)个长度单位后,两个链表往后查找的速度一致,即可以用判断两个节点是否相等的方式来判断交点的位置了。
代码实现:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA==null||headB==null) {
            return null;
        }
        int l1 = getListNodeLength(headA);
        int l2 = getListNodeLength(headB);
        boolean aLargerThanB = l1>l2;
        //可以知道两个链表的长度
        int abs = aLargerThanB?(l1-l2):(l2-l1);
        if (abs!=0) {
            if (aLargerThanB) {
                while(abs>0) {
                    headA = headA.next;
                    abs--;
                }
            }else{
                while(abs>0) {
                    headB = headB.next;
                    abs--;
                }
            }
        }
        while (headA!=null) {
            if (headA==headB) {
                return headA;
            }
            headA = headA.next;
            headB = headB.next;
        }
        return null;
    }

    public int getListNodeLength(ListNode head) {
        int length = 0;
        while(head!=null) {
            length++;
            head = head.next;
        }
        return length;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值