力扣面试题 02.07. 链表相交

力扣面试题 02.07. 链表相交

题目描述:

在这里插入图片描述

示例:

在这里插入图片描述
本题比较的是结点是否相同,不是结点内存储的值是否相同

法一:

思路:暴力遍历,选取其中一个链表为基准,使用两个while循环,比较结点是否相同。

代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
         ListNode *ptr = headA;
        ListNode *cur = headB;
        while(ptr != NULL){
            while(cur != NULL){
                if(cur == ptr){
                    return cur;
                }
                cur = cur->next;
            }
            cur = headB; //遍历一次链表B之后,要把cur重新变为B的头结点
            ptr = ptr->next;
        }
        return NULL;
    }
};
法二:

思路:
ptr指向A链表,cur指向B链表,以下默认A链表为长度较长的链表(如果B链表较长,可以使用swap函数,将A链表和B链表进行交换)

  1. 先计算两个链表的长度记为len(两个相交链表长度,比较长的那个链表在前len个结点处肯定没有相交的结点)
  2. 将指向比较长的链表头结点的指针移动len次(即指向A链表的指针移动了len次)
  3. ptr和cur指针同时移动,并且不断比较,如果存在指针相同则返回该指针,否则返回NULL

代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //计算两个链表的长度
        ListNode *ptr = headA;
        ListNode *cur = headB;
        int lenA = 0 , lenB = 0;
        while(ptr != NULL){
            lenA++;
            ptr = ptr->next;
        }
        while(cur != NULL){
            lenB++;
            cur = cur->next;
        }
        ptr = headA;
        cur = headB;
        //以lenA的长度为基准
        if(lenB > lenA){
            swap(lenA , lenB);
            swap(ptr , cur);
        }
        int temp = lenA - lenB;
        while(temp--){
            ptr = ptr->next;
        }
        while(ptr != NULL){
            if(ptr == cur){  //相交的结点
                return ptr;
            }
            ptr = ptr->next; //同时移动
            cur = cur->next;
        }
        return NULL;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurora_Galaxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值