两个链表有一个交点,如何在时间复杂度 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 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动 ...
随机推荐
- RENIX发送固定个数报文——网络测试仪实操
在使用RENIX软件时,有时候我们需要发送固定个数报文,那么该如何操作呢?以下为您讲解具体操作步骤. 第一步:预约测试资源 打开Renix软件,连接机箱, 预约端口 第二步:发送固定个数的报文 选中流 ...
- Django模板的继承与模板的导入
目录 一:模版的继承 1.什么是模板继承? 2.使用继承流程原理 3.模板继承语法 二:模板的继承使用 1.案例需求 2.总结模板继承 三:模版的导入 1.模板导入 2.模板导入格式 3.模板导入使用 ...
- c语言刷 链表题记录
61. 旋转链表 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode * ...
- 怎样打开win7的IIS功能及internet信息服务(IIS)管理器在哪里
1:在windows7桌面上的左下角,点击"开始",找到"控制面板",并点击进去.如下图所示: 2:进入控制面板后,首先将"查看方式"选择为 ...
- Cache一致性与DMA
cache一致性与DMA 第一个问题 对于进行DMA操作的设备, 并不是所有系统都保持它们的cache一致性.在这种情况下, 准备进行DMA的设备可能从RAM得到陈旧的数据, 因为脏的cache行可能 ...
- RGBA()函数详解
RGBA()函数详解 RGBA()函数用于设定颜色和颜色的透明度:
- 一、MarkDown学习笔记
MakrDown学习 MarkDown是什么? 是一种纯文件格式的标记语言,跟我们写txt和word是一样的,不过它有一些简单的标记,可以使普通文本具有一定的格式. MarkDown有什么样式? 样式 ...
- appium报错Message: Cannot set the element to ‘XXXX’. Did you interact with the correct element?
appium+python+android 在定位到模块输入内容的时候遇到了一个问题 send_keys报错 appium报错Message: Cannot set the element to 'X ...
- Chapter05 流程控制(Process Control)
目录 Chapter05 流程控制 5.1 顺序控制 5.2 分支控制 if-else 单分支基本语法: 双分支基础语法: 多分支基础语法 5.3 嵌套分支 5.4 switch分支结构 5.5 Fo ...
- LeetCode-011-盛最多水的容器
盛最多水的容器 题目描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, ...