链表结点定义如下
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; }