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

链表结点定义如下

struct ListNode {
    int val;
    ListNode* next;
};

思路:

1,两个单向链表有交点,比然从交点位置到结尾,节点的值都是一样的

2,一般链表问题都考虑下能否使用快慢指针来解决问题

3,求出两个链表长度的差值diff,快指针先走diff步

4,然后快慢指针同时走,如果快慢指针首次val值相同,则这个点为交点

ListNode* findFrrstCommonNode(ListNode* firstHead,ListNode* secondHead) {
   int firstLen = getListLength(firstHead);
   int secondLen = getListLength(secondHead);


   ListNode* fastNode = firstHead;
   ListNode* slowNode = secondHead;
   int diff = firstLen - secondLen;
   if (secondLen > firstLen) {
       diff = secondLen - firstLen;
       fastNode = secondHead;
       slowNode = firstHead;
   }
   for (int i = 0; i < diff; i++)
   {
       fastNode = fastNode->next;
   }

   while (fastNode != NULL && slowNode != NULL && fastNode->val != slowNode->val) {
       fastNode = fastNode->next;
       slowNode = slowNode->next;
   }
   return fastNode;
}
int getListLength(ListNode* node){
    int count = 0;
    while (node != NULL){
        node = node->next;
        count++;
    }
    return count;
}
原文地址:https://www.cnblogs.com/dongma/p/13925598.html