当前位置: 首页 > news >正文

Intersection of Two Linked Lists(链表)

Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A:         a1 → a2
                      ↘
                       c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3
begin to intersect at node c1.

题意:就是求取两个链表的交汇点,
要求:无交汇点返回NULL,否则返回交汇点的地址。

 
 
 
 


暴力思路:O(nm),固定A链表的第一个点,依次遍历B链表看是否有相同的点;接着固定A链表的第二个点,再依次遍历B链表,直到找到相同点为止。
hash解:时间复杂度O(n+m),空间O(n)或者O(m)
两指针解法:我们发现只要两个链表长度一样,就只需同时后移节点指针比较一个,若其中一个较长呢,其实处理一下,把两个链表变成一样长即可。
解法步骤:
1.求出两个链表的长度
2.若一样长,无需处理;若其中一个较长,则只需让较长的链表先走abs(lengthA-lengthB)步即可
3.同时后移节点指针,直到找到交汇点。
代码:
class Solution {
private:
    int getLength(ListNode* head){
        if(head==NULL) return 0;
        ListNode* p=head;
        int res=0;
        while (p->next!=NULL)
        {
            ++res;p=p->next;
        }
        return res;
    }
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==NULL||headB==NULL) return NULL;
        int length_A=getLength(headA);
        int length_B=getLength(headB);
        ListNode* pA=headA;
        ListNode* pB=headB;
        int dis=0;
        if (length_A>length_B)
        {
            dis=length_A-length_B;
            while (dis>0)
            {
                --dis;
                pA=pA->next;
            }
        }else if(length_A<length_B)
        {
            dis=length_B-length_A;
            while (dis>0)
            {
                --dis;
                pB=pB->next;
            }
        }
        while (pA!=NULL&&pB!=NULL&&pA!=pB)
        {
            pA=pA->next;
            pB=pB->next;
        }
        if(pA==pB&&pA!=NULL) return pA;
        else return NULL;
    }
};

 

 

转载于:https://www.cnblogs.com/fightformylife/p/4309810.html

相关文章:

  • FastDfs 文件系统迁移
  • js实现页面重定向
  • 纪念逝去的岁月——C/C++字符串反转
  • 【SICP练习】92 练习2.65
  • 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器
  • mysql全文索引____ft_min_word_len
  • 浅谈Servlet
  • [推荐]DDOS攻击与防范知识介绍
  • leetcode------Reverse Words in a String
  • js中常用数组方法concat join push pop slice splice shift
  • 那些年,一起学的Java 2-4
  • 那些年,一起学的Java 3-3
  • Android SDK下载项的说明
  • Linux内存管理_stack区的地址方向
  • 简单易懂的现代魔法——Play Framework攻略1
  • [译]Python中的类属性与实例属性的区别
  • CSS 三角实现
  • Java 23种设计模式 之单例模式 7种实现方式
  • Joomla 2.x, 3.x useful code cheatsheet
  • PHP的类修饰符与访问修饰符
  • Python进阶细节
  • vuex 学习笔记 01
  • Xmanager 远程桌面 CentOS 7
  • 从0实现一个tiny react(三)生命周期
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 大整数乘法-表格法
  • 工作中总结前端开发流程--vue项目
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 入门到放弃node系列之Hello Word篇
  • 微信小程序填坑清单
  • PostgreSQL之连接数修改
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (LeetCode C++)盛最多水的容器
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (十三)Maven插件解析运行机制
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *1 计算机基础和操作系统基础及几大协议
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Framework 4.6.2改进了WPF和安全性
  • ::前边啥也没有
  • @vue/cli脚手架
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Bada开发]初步入口函数介绍
  • [BJDCTF2020]The mystery of ip
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [CISCN2019 华东南赛区]Web11
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页