两个链表有一个交点,如何在时间复杂度 O(n) 和 空间复杂度 O(1) 的条件下实现?_字节跳动面试题
输入两个链表,找出它们的第一个公共结点
我们可以首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,
我们可以首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。
经过分析我们发现两个有公共结点而部分重合的链表,拓扑形状看起来像一个Y,而不可能像X,如下图所示,两个链表在值为6的结点处交汇:
比如在上图的两个链表中,我们可以先遍历一次得到它们的长度分别为5和4,也就是较长的链表与较短的链表相比多一个结点。第二次先在长的链表上走1步,到达结点2。接下来分别从结点2和结点4出发同时遍历两个结点,直到找到它们第一个相同的结点6,这就是我们想要的结果。
1 /*
2 struct ListNode{
3 int val;
4 struct ListNode *next;
5 ListNode(int x):val(x),next(NULL){}
6 };
7 */
8 List *FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {
9 int findListLength(ListNode *pHead) {
10 if (pHead == NULL)return 0;
11 int sum = 1;
12 pHead = pHead->next;
13 while (pHead != NULL) {
14 sum++;
15 pHead = pHead->next;
16 }
17 return sum;
18 }
19 ListNode *walkStep(ListNode *pHead, int step) {
20 while (step--) {
21 pHead = pHead->next;
22 }
23 return pHead;
24 }
25 int FindListLength(ListNode *pHead1, ListNode *pHead2) {
26 int len1 = findListLenth(pHead1);
27 int len2 = findListLenth(pHead2);
28 if (len1 > len2) {
29 pHead1=walkStep(pHead1,len1-len2);
30 }else{
31 pHead2=walkStep(pHead2,len2-len1);
32 }
33 while(pHead1){
34 if(pHead1==pHead2)return pHead1;
35 pHead1=pHead1->next;
36 pHead2=pHead2->next;
37 }
38 return NULL;
39 }
40 }
两个链表有一个交点,如何在时间复杂度 O(n) 和 空间复杂度 O(1) 的条件下实现?_字节跳动面试题的更多相关文章
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...
- 剑指Offer面试题:31.两个链表的第一个公共节点
一.题目:两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共结点. 链表结点定义如下,这里使用C#语言描述: public class Node { public int key; p ...
- 【Java】 剑指offer(52) 两个链表的第一个公共结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...
- 《剑指offer》第五十二题(两个链表的第一个公共结点)
// 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点. #include <iostream> #include "List.h&quo ...
- 剑指offer三十六之两个链表的第一个公共结点
一.题目 输入两个链表,找出它们的第一个公共结点. 二.思路 如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的.也就是说两个链表从尾部往前到某个点,节点都是一样的.我们可以用两个栈分别 ...
- php实现找两个链表的第一个公共结点(实例演示)
php实现找两个链表的第一个公共结点(实例演示) 一.总结 因为是链表,第一个节点公共之后,后面所有的节点都公共了 画个图实例演示一下,会超清晰且简单 二.php实现找两个链表的第一个公共结点 题目描 ...
- 剑指offer36:两个链表的第一个公共结点
1 题目描述 输入两个链表,找出它们的第一个公共结点. 2 思路和方法 方法一: 用两个指针同时从两个链表的表头开始走,当走到自己的链表结尾的时候开始从另一个链表的表头开始向后走.终止条件就是两个指针 ...
- 两个dropDownList和一个GridView的选择与显示
很久没有写ASP.NET了,今天有看到论坛上一个问题:"两个dropDownList和一个GridView,已经进行了数据绑定,现在想让第一个下拉菜单的数据改变时,第二个下拉菜单自动变到相应 ...
- 编程算法 - 两个链表的第一个公共结点 代码(C)
两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动 ...
随机推荐
- Python实现JSON序列化和反序列化
在我的应用中,序列化就是把类转成符合JSON格式的字符串,反序列化就是把JSON格式的字符串转换成类.C#的话直接用Newtonsoft.JSON就可以了,非常好用.本来以为python也会有类似的库 ...
- Redis学习笔记(详细)
目录 概述 Redis安装启动 常用五大数据类型 Redis键(key) Redis字符串(String) Redis列表(List) Redis集合(Set) Redis哈希(Hash) Redis ...
- Qt:QJsonValue
0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...
- TypeError
1.only size-1 arrays can be converted to Python scalars 问题来源:需要把一个float数组A转为int,于是直接在代码中写了 B=int(A), ...
- oracel数据库ORA-28001: the password has expired
调试c#项目时登录用户不成功ORA-28001: the password has expired错误 密码过期失效 网上查了一下,是Oracle11g密码过期的原因 Oracle提示错误消息ORA- ...
- Go代码规范梳理
Go代码规范(Code Review) 总结几个开发过程中经常会犯的代码规范错误 参考链接:https://learnku.com/go/wikis/48375 注释语句 // Request 表示运 ...
- 超好用的Markdown编辑器Typora中的常见语法
目录 下载网址 安装 一.标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二.语法环境 三.单选 四.字体 五.分割符 六.列表 七.图片引入 八.表格 九.超链接 下载网址 正版中 ...
- gdb调试快速入门
编译指令 gcc test.c -o test -g -g是加入调试信息,加入源码信息 启动gdb调试 gdb test 进入gdb中 设置参数 set args 10 20 显示参数show age ...
- Seastar 教程(二)
协程 注意:协程需要 C++20 和支持的编译器.已知 Clang 10 及更高版本可以工作. 使用 Seastar 编写高效异步代码的最简单方法是使用协程.协程没有传统continuation(如下 ...
- 微信小程序商品发布
<!--pages/good/good.wxml--> <!--商品发布--> <form bindsubmit="formSubmit"> & ...