一、题目
66. 两个链表的第一个公共结点 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/62/
二、题解
计算二者的长度差值,让长的先走插值步,然后同时开始直到相遇
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int getLen(ListNode* headA) {
int cnt = 0;
while (headA != nullptr) {
headA = headA->next;
cnt++;
}
return cnt;
}
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
int s1 = getLen(headA), s2 = getLen(headB);
ListNode* cur1;
ListNode* cur2;
int subtract = s1 - s2;
if (subtract < 0) {
cur1 = headB, cur2 = headA;
subtract *= -1;
} else {
cur1 = headA, cur2 = headB;
}
while (subtract--) {
cur1 = cur1->next;
}
while (cur1 != cur2) {
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
};