这道题重点在理解题意,牛客网的标签是难度中等,二星,其实只要题意理解清楚了就很简单
问题描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
知识点:链表
解题思路
做这道题需要知道的两点:
- 公共结点,并不是说当前结点相同,而是从此结点开始到链表结尾的一串子链表都一模一样
- 链表是有序的,且为递增排列,这是题目中隐含的,通过给的测试用例就能看看出来,有序的话给这道题减小了不少难度,也大大降低了时间复杂度
具体做法:从头结点开始,依次扫描两个链表,直到找到两个链表的当前结点都相同的情况,也只需要判断当前结点是否相等(测试用例的输入是以三段链表的形式表示的,分别为:链表1的前半段,链表2的前半段,链表12共有的后半段),如果当前节点不等只需移动较小的那一方的指针
我遇到的问题
- 段错误,经常犯的问题,务必在访问结点前,判断它是非NULL的
- 循环的问题,在判断当前结点不为空后,next指针后移,当前结点为空时,要跳出循环break;注意这个条件,不然会造成死循环
- 最一个结点,不要忽略只有最后一个结点相同的情况,为了方便,我在最外层循环直接加了next指针不为空才可进入循环,但这样会造成访问不到最后一个结点
源代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* p1=pHead1;
ListNode* p2=pHead2;
while(p1!=NULL&&p2!=NULL){
if(p1->val==p2->val)
return p1;
if(p1->val<p2->val){
if(p1->next!=NULL)
p1=p1->next;
else
break;
}
if(p1->val>p2->val){
if(p2->next!=NULL)
p2=p2->next;
else
break;
}
}
return NULL;
}
};