两个单链表的第一个公共节点
时间:2019-08-19
本文章向大家介绍两个单链表的第一个公共节点,主要包括两个单链表的第一个公共节点使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【问题】输入两个链表,找出它们的第一个公共结点。(单向无环)
【思路】第一个思路,使用hash_set作为辅助空间,首先遍历第一个链表,将链表每个地址保存到hash_set中,然后再遍历第二个链表,边遍历边查找,如果找到,则返回该节点,否则返回nullptr.
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1 == nullptr || pHead2 == nullptr) return nullptr; ListNode* cur = pHead1; unordered_set<ListNode*> hash_set; while(cur != nullptr){ hash_set.insert(cur); cur = cur->next; } cur = pHead2; while(cur != nullptr){ if(hash_set.find(cur) != hash_set.end()){ return cur; } cur = cur->next; } return nullptr; } };
第二种思路是不使用额外的辅助空间,直接进行遍历,假设当较短的链表这阵p1遍历完成后,将指针移到长链表的头节点pHead2,等p2也遍历完成后,指向pHead1,此时p1和p2之间的节点数正好两个链表节点数量的差,然后两个指针齐头并进,如果相交,则一定可以找到p1==p2的节点,并返回,否则返回nullptr。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *p1 = pHead1; ListNode *p2 = pHead2; while(p1!=p2){ p1 = (p1==NULL ? pHead2 : p1->next); p2 = (p2==NULL ? pHead1 : p2->next); } return p1; } };
原文地址:https://www.cnblogs.com/zhudingtop/p/11377176.html
- velocity分页模板
- js基础-表单验证和提交
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
- oracle创建用户
- oracle创建表相关
- spring学习遇到的问题汇总
- Java XML解析工具 dom4j介绍及使用实例
- redis学习教程之一基本命令
- 在java中使用redis
- springmvc学习笔记--json--返回json的日期格式问题
- springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
- velocity的一些用法
- String.split()用法以及特殊分隔符注意,ps:|
- Mybatis在idea中错误:Invalid bound statement (not found)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springmvc实例之修改雇员相关信息(四)
- 基于TypeScript封装Axios笔记(六)
- 蓝桥杯 k好数 java版
- 强烈推介的几个微信小程序开发小技巧,简单又实用
- 【pytorch-ssd目标检测】验证自己创建的数据集
- django-模板之自动转义autoescape(八)
- 【pytorch-ssd目标检测】测试自己创建的数据集
- 【pytorch-ssd目标检测】训练自己创建的数据集
- SwiftUI:更高级的 MKMapView
- spring AOP之重用切点表达式
- springmvc之处理模型数据SessionAttributes注解
- Spring BeanUtils属性copy
- 【pytorch-ssd目标检测】制作类似pascal voc格式的目标检测数据集
- 【pytorch-ssd目标检测】可视化检测结果
- 文件I/O