首页 > 其他分享 >面试题 02.07. 链表相交

面试题 02.07. 链表相交

时间:2024-11-28 19:57:04浏览次数:6  
标签:面试题 ListNode cur 02.07 next 链表 curB headB curA

题目

自己写的:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:

    ListNode *getIntersection(ListNode *headA, ListNode *headB, int lenA, int lenB)
    {
        int sub = lenA - lenB;

        ListNode *curA = headA, *curB = headB;
        while (sub--)
        {
            curA = curA->next;
        }
        while (curA && curB && curA != curB)
        {
            curA = curA->next;
            curB = curB->next;
        }
        return curA;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lA = 0, lB = 0;
        ListNode *cur = headA;
        while (cur)
        {
            ++lA;
            cur = cur->next;
        }
        cur = headB;
        while (cur)
        {
            ++lB;
            cur = cur->next;
        }
        if (lA >= lB)
        {
            return getIntersection(headA, headB, lA, lB);
        }
        else
        {
            return getIntersection(headB, headA, lB, lA);
        }
    }
};

这题有一个很大的坑就是题目中说的相交的起始节点其实是指节点的地址相等,而不是节点的值相等。

其实观察仔细的话,从给的示例1应该就能看出这点:

img

输出的是8,而不是1。

后面的两个示例感觉都有点迷惑性,引导掉坑里。

我刚开始写的代码就是没明白这点,就没通过:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:

    ListNode *getIntersection(ListNode *headA, ListNode *headB, int lenA, int lenB)
    {
        int sub = lenA - lenB;

        ListNode *curA = headA, *curB = headB;
        while (sub--)
        {
            curA = curA->next;
        }
        while (curA && curB && curA->val != curB->val)
        {
            curA = curA->next;
            curB = curB->next;
        }
        return curA;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lA = 0, lB = 0;
        ListNode *cur = headA;
        while (cur)
        {
            ++lA;
            cur = cur->next;
        }
        cur = headB;
        while (cur)
        {
            ++lB;
            cur = cur->next;
        }
        if (lA >= lB)
        {
            return getIntersection(headA, headB, lA, lB);
        }
        else
        {
            return getIntersection(headB, headA, lB, lA);
        }
    }
};

然后看了下卡哥的思路,和我差不多,不过他的代码我觉得更优,其实没必要再定义一个函数来专门针对两个链表的长度谁打谁小的问题。

卡哥代码:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

官方题解提供了两种方法,也值得看一下,方法一是用哈希集合,方法二看的我一愣一愣的,神人也!

标签:面试题,ListNode,cur,02.07,next,链表,curB,headB,curA
From: https://www.cnblogs.com/hisun9/p/18575045

相关文章

  • 链表篇
    链表篇跳-移除链表元素-203-力扣给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head......
  • 面试题精选16-Nginx的应用场景有哪些
    1.Web服务器Http配置Https配置2.反向代理服务器Nginx作为请求入口,客户端访问Nginx,Nginx再将请求转发到后端,最后响应给客户端,以此防止后端服务器对外暴露,提高服务器的安全性。3.负载均衡将Nginx作为负载均衡器,客户端访问Nginx时,Nginx采取某种策略(默认是轮询策略)将请求......
  • 234.回文链表
    回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O......
  • 阿里技术岗位笔试&面试题:最大频率栈
    题目:最大频率栈。实现FreqStack,模拟类似栈的数据结构的操作的一个类。FreqStack有两个函数:push(intx),将整数x推入栈中pop(),它移除并返回栈中出现最频繁的元素。如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。◼示例:push[5,7,5,7,4,5]pop()->返回5,因......
  • 前端面试题-1(详解事件循环)
    1.了解浏览器的进程模型1.什么是进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。2.什么是线程?有了进程后,就可以运行程序的代码了。我们可以理解为操作程序的'人'就是线......
  • 测试面试题总结
    功能抓包APPUI自动化项目:项目流程,如何排期测试流程,项目周期项目流程中的问题介绍项目核心功能,如何设计用例熟悉或最近的项目,业务功能,和负责部分,如何进行测试业务测试除了功能上还有其他方面的逻辑测试吗项目最近发版时间开发技术评审发现了什么问题开发逻辑讲......
  • 206. 删除链表的倒数第n个节点
    题目卡哥思路卡哥是用双指针来解题,我没想出来这个思路。精华部分:双指针的经典应用,如果要到达倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾(nullptr)。slow所指向的节点就是倒数第n个节点。跟着卡哥代码敲了下:/***Definitionforsingly-linked......
  • ASP.NET Core面试题汇总
    1.如何在controller中注入service?在configservices方法中配置这个service。在controller的构造函数中,添加这个依赖注入。 2.ASP.NETCore比ASP.NET更具优势的地方是什么?跨平台,ASP.NETCore可以运行在Windows、Linux和MAC系统上;对框架本安装没有依赖,所有依赖都跟......
  • LeetCode21 合并两个有序链表
    LeetCode21合并两个有序链表题目链接:LeetCode21描述将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]思路方法一:迭代遍历两个列表,逐一比较时间复杂度:O(n+m)......
  • 【快慢指针技巧】:高效解决链表和数组问题(26,83,27)
    ......