剑指 Offer 52. 两个链表的第一个公共节点
题目描述
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
注意:
如果两个链表没有交点,返回
null
.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 \(O(n)\) 时间复杂度,且仅用\(O(1)\) 内存。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA = getLength(headA);
int lenB = getLength(headB);
ListNode* pA = headA;
ListNode* pB = headB;
if(lenA > lenB)
for(int i = 0; i < (lenA - lenB); i++)
pA = pA->next;
else
for(int i = 0; i < (lenB - lenA); i++)
pB = pB->next;
while(pA != NULL) {
if(pA == pB)
return pA;
pA = pA->next;
pB = pB->next;
}
return NULL;
}
int getLength(ListNode* head) {
ListNode* p = head;
int length = 0;
while(p != NULL) {
p = p->next;
length++;
}
return length;
}
};