单链表~输入两个链表,找出它们的第一个公共结点

分析:

  1. 首先,我们来分析一下题目,题目要求输入两个链表,那么我们要明白这两个链表可能是一样长,也有可能长短不一,如下图所示.
  2. 如果两个链表相交且长度不一样,那么一定是在相交前长度不一样,由此,我们可以先分别定义一个lenA和lenB,分别遍历两个链表,求得lenA和lenB
  3. len为lenA和lenB的差值,若lenA小于lenB,则用后者减去前者,然后遍历较长的链表,让其往后移len个长度
  4. 然后在两个链表不相等的前提下,让两个链表一人走一步,直到两个链表的某一结点地址相同了,就退出循环,返回其中的一个节点
  5. 若两个链表不相交,则返回的是空指针null,否则返回的是二者相交的那个节点

在这里插入图片描述

public static ListNode midNode(ListNode headA, ListNode headB) {
    if(headA == null || headB == null) {
        return null;
    }
    ListNode pL = headA;//永远指向最长的单链表
    ListNode pS = headB;//永远指向最短的单链表
    
    int lenA = 0;
    int lenB = 0;
    //求lenA,lenB的长度
    while(pL != null) {
        lenA++;
        pL = pL.next;
    }
    while(pS != null) {
        lenB++;
        pS = pS.next;
    }
    pL = headA;
    pS = headB;
    //求两个链表的长度
    int len = lenA - lenB;
    if(len < 0) {
        pL = headB;
        pS = headA;
        len = lenA - lenB;
    }
    //让较长的链表先走len步
    while(len > 0) {
        pL = pL.next;
        len--;
    }
    //让pL和pL一人走一步
    while(pL != pS) {
        pS = pS.next;
        pL = pL.next;
    }
    return pL;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值