剑指offer刷题8 两个链表的第一个公共结点

这道题重点在理解题意,牛客网的标签是难度中等,二星,其实只要题意理解清楚了就很简单

问题描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
要求:时间限制: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;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值