LeetCode找到两个链表的第一个重合节点

该算法首先计算两个链表的长度,然后让长度较长的链表向前移动相应步数以使它们齐平。接着同时遍历两个链表,当链表节点地址相同时,即找到交点。需要注意的是,不能直接在`abs()`函数中使用自增操作,需先赋值给变量。
摘要由CSDN通过智能技术生成

剑指 Offer II 023. 两个链表的第一个重合节点 - 力扣(LeetCode)

 

 1.如果他们的有相同的节点,那么应该是从后向前数最后一个相同的节点是从前向后数第一个相同的节点,这个节点是要返回的节点我们的求法是先计算两个链表的长度,然后让他们齐平,然后同时向后走,如果他们的地址相同,这就是需要返回的值我们不需要担心如果永远没有相同的节点怎么办,因为他们会最终同时到达null,一定会相同

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    //返回的是相同的节点
    //先计算两个链表的长度
    struct ListNode* cur1=headA;
    int len1=0;
    while(cur1)
    {
        len1++;
        cur1=cur1->next;
    }
    struct ListNode* cur2=headB;
    int len2=0;
    while(cur2)
    {
        len2++;
        cur2=cur2->next;
    }
    //将长的那个移动到等长的位置
    if(len1<len2)
    {
        //移动len2
        int n=abs(len2-len1);
        while(n--)
        {
            headB=headB->next;
        }
    }
    else
    {
        //移动len1
        int n=abs(len2-len1);
        while(n--)
        {
            headA=headA->next;
        }
    }
    //开始同时移动,如果二者地址相同那么就是同一个节点
    while(headA!=headB)
    {
        headA=headA->next;
        headB=headB->next;
    }
    return headA;
    
}

这里还有一个需要注意的地方(我就是之前没有注意这里的问题)

abs()--;这种写法是不被允许的,因为计算的值计算机认为是一个常数,而自增自减的操作都是对于变量进行的操作,所以我们需要现将他赋值给变量

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值