栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣面试题 02.07. 链表相交

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣面试题 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;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869817.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号