寻找两个链表的第一个公共结点

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {

    }
}
  • 思路
    如果两个链表有公共结点,那么最后公共结点之后的部分一定是完全相同的,类似于一个“Y”的形状。我们可以先求出两个链表的长度(用len1 和len2表示)。然后长度更长的链表(假设len1 > len2)先走len1 - len2步。然后两个链表一起走。第一个相同的结点就是他们的第一个公共结点。
    还要注意特殊情况:链表为空或没有公共结点。
  • 我的代码
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {  
         if(pHead1==null || pHead2==null)   return null;
         int len1 = 0, len2 = 0;
         ListNode firstCommNode = null, tmp1 = pHead1, tmp2 = pHead2;
         while(tmp1 != null){
             len1++;
             tmp1 = tmp1.next;
         }
         while(tmp2 != null){
            len2++;
            tmp2 = tmp2.next;
         }

         tmp1 = pHead1; tmp2 = pHead2;
         if(len1 > len2){
             for(int i=0; i<len1-len2; i++){
                 tmp1 = tmp1.next;
             }
         }else if (len2 > len1) {
             for(int i=0; i<len2-len1; i++){
                 tmp2 = tmp2.next;
             }
        }

         while(tmp1!= null && !tmp1.equals(tmp2)){
             tmp1 = tmp1.next;
             tmp2 = tmp2.next;
         }
         firstCommNode = tmp1;
         return firstCommNode;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值