leetcode腾讯精选练习之相交链表(六)
相交链表
题目:
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
示例 2:
输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
示例 3:
输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
解释:这两个链表不相交,因此返回 null。
思路:
分别定义两个指针以相同的速度前进,在相同长度的链表上移动,如果两个链表有交点,那么两个指针一定会相遇(即相同)。但是题目给的两个链表不可能长度相同,应该怎么办呢,那就先求出两个链表的长度,然后再将比较长的链表先移动两个链表长度差值个结点,这样就可以确保整个链表在移动的过程中等长了。
1.统计出两个链表长度countA和countB
2.让长度长的链表先移动|countA - countB|个结点。
3.然后两个链表同时移动,如果指向两个链表的指针相同则为交点。
代码:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pFirst = headA;
ListNode* pSec = headB;
int countA = 0;
int countB = 0;
while(pFirst != NULL) {
countA++;
pFirst = pFirst->next;
}
pFirst = headA;
while(pSec != NULL) {
countB++;
pSec = pSec->next;
}
pSec = headB;
if (countA > countB) {
for (int i = 0; i < countA - countB; ++i) {
pFirst = pFirst->next;
}
} else {
for (int i = 0; i < countB - countA; ++i) {
pSec = pSec->next;
}
}
while (pFirst != NULL && pSec != NULL) {
if (pFirst == pSec) {
return pFirst;
}
pFirst = pFirst->next;
pSec = pSec->next;
}
return NULL;
}
总结:
这个题目的关键点是不等长的两个链表应该先调整到等长的位置,在寻找交点。

leetcode腾讯精选练习之相交链表(六)的更多相关文章
- leetcode腾讯精选练习之旋转链表(四)
旋转链表 题目: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...
- LeetCode 腾讯精选50题--链表排序
解题思路:归并 先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置 合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位 ...
- LeetCode 腾讯精选50题--合并K个排序链表
今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的: 1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作, 2.其次是多个链表的合并,所以在第一步实现的基础上 ...
- leetcode腾讯精选练习之两数相加
两数相加 题目: 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们 ...
- leetcode腾讯精选练习(50 题)(持续更新)
1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...
- LeetCode 腾讯精选50题--二叉树中的最大路径和
二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...
- LeetCode 腾讯精选50题--二叉树的最大深度
求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...
- LeetCode 腾讯精选50题--2的幂
在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...
- LeetCode 腾讯精选50题--求众数
由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...
随机推荐
- 思科路由器、交换机配置Console 线线序 (亲测可以)
网上有许多标准console线配置线序,在配置思科网络设备时都是不能用的,因为思科的console线序是专用的, 如下 水晶头侧 线序 B 白橙,橙,白绿,蓝 ,白蓝,绿,白粽,棕 对应串口侧线序 1 ...
- VS自定义模板-以自定义类模板为样例
前言 在实际的工作过程中部分公司会要求开发人员在开发过程中需遵守一些开发规范,开发规范中主要包括文件的注释规范,项目.文件.变量的命名规范(例如驼峰规范)等等.例如我们代码规范中就有一项新增文件的文件 ...
- c++输入输出,保留几位小数
#include <iomanip> //头文件 //第一种写法 cout<<setiosflags(ios::); //第二种写法 cout.setf(ios::fixed) ...
- web自动化之三大等待
这个假期有些长,长到忘记了要学习,要找工作,好吧,在我每天无休止的追着偶像剧时,我确实没有负罪感,在听了小祥大佬的分享后,我连睡午觉都被吓醒.大佬跟我同一个班,在大厂工作,每天还抽时间学习,作业也没落 ...
- Mysql 两种引擎的区别
MyISAM与InnoDB的区别是什么? 1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 ...
- 关于vector的描述
对于有些编译器而言,使用vector<vector<int>> vec;并不能通过,必须采用vector<vector<int> >vec才可以通过.两 ...
- Spring AOP-基于@AspectJ风格
关于Spring AOP,可以去看看官方文档: https://docs.spring.io/spring-framework/docs/current/spring-framework-refere ...
- 纪中17日T1 2321. 方程
纪中17日T1 2321. 方程 (File IO): input:cti.in output:cti.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto ...
- .net core 中如何读取 appsettings.json 相关配置
appsettings.json如下 { "Logging": { "LogLevel": { "Default": "Debug ...
- Deepin Linux折腾输入法
Deepin Linux 别折腾输入法了 , 很容易把自己整残了 Deepin 自带五笔拼音输入法 , 平时撸码用完全够了 . 但今天突然快捷键不好用了.怎么都切不了英文输入 . 切输入法也不能切到英 ...