36、两个链表的第一个公共结点

题目描述:输入两个链表,找出它们的第一个公共结点。

首先,公共结点的概念指两个相同的节点,后面都相同才叫相同,否则只能叫两个结点的值相同。

因此,题目相当于求两个链表从哪一个节点开始后半部分完全相同。

思路:先计算两个链表各自的长度,让长的链表先走它俩长度差步,然后再一起走,直到找到共同节点。思路很容易理解,下面的代码写的很清晰。

代码:

/*
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:如果题目要求是判断两个链表是否相交,这个方法就不适用了,判断的方法:


遍历第一个链表,让第一个链表的尾部指向第二个链表的头,这样问题变成了检查第二个链表是否有环。

直接检查最后一个节点是否相同,相同则有公共节点,否则没有。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值