剑指Offer: 求两个链表的第一个公共节点

题目描述

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

思想

1.先判断两个链表是否会相交(最后一个节点的元素相等肯定相交)

2.求得两个链表的长度,(假设len1>len2),先让链表1遍历len1-len2个节点到节点p(p到链表1尾节点的长度和head2到链表2尾节点的长度相等),这时同时遍历两个链表,直到有相同的节点为止。

实现代码

 
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
   if(pHead1==null || pHead2==null){
    return null;
   }
//	1. 先判断是否会相交,若相交,则最后一个元素肯定相同
   ListNode t1 = pHead1;
   int len1=0,len2=0;

   ListNode t2 = pHead2;
   while(t1 != null){
    t1 = t1.next;
    len1++;
   }
   while(t2 != null){
    t2 = t2.next;
    len2++;
   }
   if(t1 != t2){
    return null;
   }
//	2. 找第一个公共节点 
   ListNode p1 = pHead1;
   ListNode p2 = pHead2;
   if(len1 > len2){
    int k = len1 - len2;
    while(k!=0){
     p1 = p1.next;
     k--;
    }
   }else{
    int k = len2 - len1;
    while(k!=0){
     p2 = p2.next;
     k--;
    }
   }
   while(p1 != p2){
    p1 = p1.next;
    p2 = p2.next;
   }
   return p1;
 }

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/80918991