算法(38)--两个链表的第一个公共结点

前言

仅记录学习笔记,如有错误欢迎指正。

题目

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。

示例

  • 输入: {1,2,3,6,7},{2,3,4,6,7}
  • 输出: 6

解法

找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部)

int m = 0;
        int n = 0;
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        if(p1 == null || p2 == null){
            return null;
        }
      while(p1.next!=null){
          m++;
          p1 = p1.next;
      }
       while(p2.next!=null){
          n++;
          p2 = p2.next;
      }
      if(m>n){
          pHead1 = walkStep(pHead1,m - n);
      }else{
          pHead2 = walkStep(pHead2,n - m);
      }
       while(pHead1 != null){
            if(pHead1 == pHead2) return pHead1;
            pHead1 = pHead1.next;
            pHead2 = pHead2.next;
       }
        return null;
    }
     public ListNode walkStep(ListNode  pHead1, int step){
        while(step-- !=0){
            pHead1 = pHead1.next;
        }
        return pHead1;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值