题目描述:输入两个链表,找出它们的第一个公共结点。
首先,公共结点的概念指两个相同的节点,后面都相同才叫相同,否则只能叫两个结点的值相同。
因此,题目相当于求两个链表从哪一个节点开始后半部分完全相同。
思路:先计算两个链表各自的长度,让长的链表先走它俩长度差步,然后再一起走,直到找到共同节点。思路很容易理解,下面的代码写的很清晰。
代码:
/*
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 = computlength(pHead1);
int len2 = computlength(pHead2);
if(len1 > len2)
pHead1 = walkstep(pHead1,len1-len2);
else
pHead2 = walkstep(pHead2,len2-len1);
while(pHead1!=NULL){
if(pHead1==pHead2)
return pHead1;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return NULL;
}
int computlength(ListNode* pHead){
if(pHead==NULL)
return 0;
int res = 0;
while(pHead!=NULL){
res++;
pHead = pHead->next;
}
return res;
}
ListNode* walkstep(ListNode* pHead,int step) {
while(step--){
pHead = pHead->next;
}
return pHead;
}
};
tips:
自加自减的问题
//这种赋值的情况,等同于a[x] = 10;x++;先赋值,再自加
vector<int> a(n);
int x = 2;
a[x++] = 10;
//先判断,再自减,循环执行b次
while (b--)
//先自减,再判断,循环执行(b-1)次
while (--b)
pppps:如果题目要求是判断两个链表是否相交,这个方法就不适用了,判断的方法:
Ⅰ
遍历第一个链表,让第一个链表的尾部指向第二个链表的头,这样问题变成了检查第二个链表是否有环。
Ⅱ
直接检查最后一个节点是否相同,相同则有公共节点,否则没有。