- 链表长度差
思路:先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可。
*2 双指针
思想:使用两个指针pFirstNode和pSecondNode分别指向两个链表pHead1,pHead2的头结点,然后同时分别逐结点遍历,
当pFirstNode到达链表pHead1的末尾时,重新定位到链表headB的头结点;当pSecondNode到达链表headB的末尾时,
重新定位到链表pHead1的头结点。这样,当pFirstNode和pSecondNode相遇时,所指向的结点就是第一个公共结点。
简言之,链表拼接,然后双指针遍历查找
3 栈 (计算不全 5/8)
思想:将节点放入栈,根据栈的先进后出原理,栈弹出节点,若弹出节点不相等,则退出,且计算弹出节点的个数commLen,
根据链表1的个数pHeadLen1 减去 commLen 等于 链表1移动的个数pHeadMoveLen, 计算公共节点
/*
* 1. 链表长度差
* 思路:先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可。
*/
ListNode* ListsLenDiffClass::FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
if (pHead1 == nullptr || pHead2 == nullptr) {
return nullptr;
}
CreateListClass createListClass;
int pHeadLen1 = 0;
int pHeadLen2 = 0;
ListNode* pFirstNode = pHead1;
ListNode* pSecondNode = pHead2;
while (pFirstNode != nullptr) {
pHeadLen1++;
pFirstNode = pFirstNode->next;
}
while (pSecondNode != nullptr) {
pHeadLen2++;
pSecondNode = pSecondNode->next;
}
if (pHeadLen1 < pHeadLen2) {
int pHeadLen = pHeadLen2 - pHeadLen1;
while(pHeadLen--) {
pHead2 = pHead2->next;
}
} else {
int pHeadLen = pHeadLen1 - pHeadLen2;
while(pHeadLen--) {
pHead1 = pHead1->next;
}
}
while(pHead1 != nullptr && pHead2 != nullptr) {
if (pHead1 == pHead2) {
return pHead1;
}
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return nullptr;
}
/*
*2 双指针
* 思想:使用两个指针pFirstNode和pSecondNode分别指向两个链表pHead1,pHead2的头结点,然后同时分别逐结点遍历,
* 当pFirstNode到达链表pHead1的末尾时,重新定位到链表headB的头结点;当pSecondNode到达链表headB的末尾时,
* 重新定位到链表pHead1的头结点。这样,当pFirstNode和pSecondNode相遇时,所指向的结点就是第一个公共结点。
* 简言之,链表拼接,然后双指针遍历查找
*/
ListNode* TwoPointersClass::FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == nullptr || pHead2 == nullptr) {
return nullptr;
}
ListNode* pFirstNode = pHead1;
ListNode* pSecondNode = pHead2;
while(pFirstNode != pSecondNode) {
if (pFirstNode == nullptr) {
pFirstNode = pHead2;
} else {
pFirstNode = pFirstNode->next;
}
if (pSecondNode == nullptr) {
pSecondNode = pHead1;
} else {
pSecondNode = pSecondNode->next;
}
}
return pFirstNode;
}
/*
* 3 栈
* 思想:将节点放入栈,根据栈的先进后出原理,栈弹出节点,若弹出节点不相等,则退出,且计算弹出节点的个数commLen,
* 根据链表1的个数pHeadLen1 减去 commLen 等于 链表1移动的个数pHeadMoveLen, 计算公共节点
*/
ListNode* StackClass::FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == nullptr || pHead2 == nullptr) {
return nullptr;
}
ListNode* pFirstNode = pHead1;
ListNode* pSecondNode = pHead2;
std::stack<ListNode*> listNodeStack1;
std::stack<ListNode*> listNodeStack2;
while (pFirstNode != nullptr) {
listNodeStack1.push(pFirstNode);
pFirstNode = pFirstNode->next;
}
while (pSecondNode != nullptr) {
listNodeStack2.push(pSecondNode);
pSecondNode = pSecondNode->next;
}
int listNodeStackSize1 = listNodeStack1.size();
int pHeadMoveLen1 = 0;
//计算公共节点
while(!listNodeStack1.empty() && !listNodeStack2.empty()) {
if (listNodeStack1.top() != listNodeStack2.top()) {
break;
} else {
listNodeStack1.pop();
listNodeStack2.pop();
pHeadMoveLen1++;
}
}
int pHeadMoveLen2 = listNodeStackSize1 - pHeadMoveLen1;
while(pHeadMoveLen2--) {
pHead1 = pHead1->next;
}
return pHead1;
}

京公网安备 11010502036488号