【剑指Offer-时间效率与空间效率的平衡】面试题52:两个链表的第一个公共节点
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路
由于数据结构是链表,若两个链表存在公共节点,则从该公共节点往后的节点也是公共节点。
如果两个链表长度相等,则从头开始同时遍历两个链表,两个链表第一个相同的节点就是第一个公共节点。如果长度不同,不妨令第一个链表的长度len1大于第二个链表的长度len2,则先遍历长的链表len1-len2步,这样两个链表剩余的长度就相等了,此时再同时遍历两个链表,直至找到第一个公共节点。代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1 = getListLen(pHead1);
int len2 = getListLen(pHead2);
ListNode* pLong(0);
ListNode* pShort(0);
int delta = 0;
if(len1>len2){
pLong = pHead1;
pShort = pHead2;
delta = len1-len2;
}else{
pLong = pHead2;
pShort = pHead1;
delta = len2-len1;
}
while(delta>0){
pLong = pLong->next;
delta--;
}
while(pLong!=nullptr && pShort!=nullptr){
if(pLong==pShort)
return pLong;
pLong = pLong->next;
pShort = pShort->next;
}
return nullptr;
}
int getListLen(ListNode* pHead){
int len=0;
ListNode* temp = pHead;
while(temp!=nullptr){
temp = temp->next;
len++;
}
return len;
}
};
总结
有些关于链表的问题都可以使用一快一慢的两个指针来解决。