题目:
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:
先统计两个链表的长度,然后长的链表先向后遍历,到剩下的长度和短的相同时,两个链表同时向后遍历,第一个相同的节点即是第一个公共节点
代码实现:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len_1 = GetLength(pHead1);
int len_2 = GetLength(pHead2);
int len_dif = len_1 > len_2 ? (len_1 - len_2) : (len_2 - len_1);
ListNode* pNode_long = len_1 > len_2 ? pHead1 : pHead2;
ListNode* pNode_short = len_1 > len_2 ? pHead2 : pHead1;
for(int i = 0; i < len_dif; i++)
pNode_long = pNode_long->next;
while((pNode_long != nullptr) && (pNode_short != nullptr) && (pNode_long != pNode_short))
{
pNode_long = pNode_long->next;
pNode_short = pNode_short->next;
}
ListNode* result = pNode_long;
return result;
}
int GetLength(ListNode* pHead)
{
int len = 0;
ListNode* pNode = pHead;
while(pNode != nullptr)
{
++len;
pNode = pNode->next;
}
return len;
}
};