总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
输入两个链表,找出它们的第一个公共节点。链表节点定义如下:
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
解题思路:
1.这个题主要需要抓住一点,观察链表节点构造发现是一个单向链表,且对于一个节点,只有一个next节点,所以两个链表如果存在公共节点,那么从这个公共节点开始,这两个链表之后的元素应该完全一致。
2.解法一可以使用栈,把两个链表分别入栈,如果有公共节点,那么两个栈栈顶的元素一定相同,同时出栈直到元素不同为止,这个时候说明上一个出栈的节点为第一个公共节点。
3.解法二:如果某个链表更长,它必在链表头端多出n个元素,那么在链表头先走n步,之后两个链表同时后移,直到找到相等的节点即为公共节点。
可以AC的解法二【C++版本】
#include <iostream>
#include <math.h>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x):val(x),next(nullptr) {}
};
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2);
int main() {
system("pause");
return 0;
}
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == NULL || pHead2 == NULL)return nullptr;
int cnt1 = 0, cnt2 = 0;
ListNode *tmp1 = pHead1, *tmp2 = pHead2;
while (tmp1 != NULL) {
cnt1++;
tmp1 = tmp1->next;
}
while (tmp2 != NULL) {
cnt2++;
tmp2 = tmp2->next;
}
int dis = abs(cnt1 - cnt2);
tmp1 = pHead1;
tmp2 = pHead2;
if (cnt1 > cnt2) {
while (dis > 0) {
tmp1 = tmp1->next;
dis--;
}
}
else {
while (dis > 0) {
tmp2 = tmp2->next;
dis--;
}
}
while (tmp1 != NULL && tmp2 != NULL) {
if (tmp1->val == tmp2->val) {
return tmp1;
}
tmp1 = tmp1->next;
tmp2 = tmp2->next;
}
return nullptr;
}