/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ // 获取链表长度 int getLensOfList(ListNode* head) { int len = 0; while (head != nullptr) { head = head->next; len++; } return len; } // 将head向后移动num个节点 ListNode* moveNode(ListNode** head, int num) { for (int i = 0; i < num; i++) { *head = (*head)->next; } return *head; } class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { // 空处理 if (pHead1 == nullptr || pHead2 == nullptr) { return nullptr; } // 标记位 为0即为pHead1长反则pHead2长 int flag; //k 获取len1 len2长度 int len1 = getLensOfList(pHead1); int len2 = getLensOfList(pHead2); if (len1 > len2) { flag = 0; } else { flag = 1; } // 计算差值 int diffOfLen = abs(len1 - len2); // 将较长的链表移动相差个数个节点 if (flag == 0) { moveNode(&pHead1, diffOfLen); } else { moveNode(&pHead2, diffOfLen); } // 一起向后走若同时走到尾则没有相交 while (pHead1 != nullptr || pHead2 != nullptr) { // 若两节点相等则为相等节点 if (pHead1 == pHead2) { return pHead1; } pHead1 = pHead1->next; pHead2 = pHead2->next; } return nullptr; } };