链表相交

同:160.链表相交

力扣题目链接(opens new window)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

示例 2:

示例 3:

思路

根据LeetCode题目下的隐藏提示4以及观察可知:

如果两个链表存在相交部分,那么自相交点之后的节点应该都是重合的(下面的图没体现出来)

由此,我们可以将待判断的两个链表的尾部对齐

将较长链表的当前指针指向与短链表的对齐

从此处同时向后遍历,直到找到相同的节点

思路大概是这样的,那么关键要解决两个问题:

​ 1、如何找出较长的那个链表?

​ 2、如何尾部对齐?

因为我们有两个链表,那么先直接定义两个指针curA和curB,并且,curA一定是指向较长的那个链表的指针。

实际上第一个问题用遍历解决就行了,但是在过程中,万一最开始定义的链表并不是最长的,应该如何处理?例如curA实际上比curB短,这时需要将两者调换

调换过程也比较简单粗暴,当记录长度的变量显示curA比curB短后,将curA和curB交换就行(同时还要将长度变量互换)

这个时候,求出两链表的长度差,将curA移动到curB所在的位置,就能将尾部对齐

代码

public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//初始化两链表的头节点,默认A为较长的那个
ListNode curA = headA;
ListNode curB = headB; //用于记录链表长度
int lenA = 0;
int lenB = 0; //分别遍历获取两链表长度
while(curA != null){
lenA++;
curA = curA.next;
} while(curB != null){
lenB++;
curB = curB.next;
} //遍历结束重新将指针放回头节点
curA = headA;
curB = headB; //如果lenB大,就要交换一下
if(lenB > lenA){
//交换节点
ListNode tempN;
tempN = curA;
curA = curB;
curB = tempN; //交换长度信息
int tempL = lenA;
lenA = lenB;
lenB = tempL;
} //尾部对齐
//先计算长度差值
int subResult = lenA - lenB;
//移动指针对齐短链表
while(subResult-- > 0){
curA = curA.next;
} //两链表同时向后遍历,遇到相同值便返回
while(curA != null){
if(curA == curB){
return curB;//A、B都行
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}
c++版
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//初始化两链表的头节点,默认A为较长的那个
ListNode* curA = headA;
ListNode* curB = headB; //用于记录长度的变量
int lenA = 0;
int lenB = 0; //分别遍历获取两个链表的长度
while(curA != NULL){
lenA++;
curA = curA->next;
}
while(curB != NULL){
lenB++;
curB = curB->next;
}
//遍历结束,重新将指针放回头结点处
curA = headA;
curB = headB; //如果B长就交换一下节点
if(lenB > lenA){
// //交换节点
// ListNode* tempNode;
// tempNode = curA;
// curA = curB;
// curB = tempNode;
swap(curA, curB); //交换长度信息
swap(lenA, lenB);
}
//尾部对齐
//先计算长度差
int subResult = lenA - lenB;
//移动长链表的指针到短链表头位置
while(subResult--){
curA = curA->next;
} //两链表同时向后遍历,遇到相同值就返回
while(curA != NULL){
if(curA == curB){
return curB;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};
易错点

1、统计完长度记得把指针调回链表头部

2、一定要在处理lenA小于lenB情况的逻辑之前将指针重新置回头节点处,不然结果会有问题

【LeetCode链表#12】链表相交的更多相关文章

  1. 【LeetCode题解】160_相交链表

    目录 160_相交链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(推荐) 思路 Java 实现 Python 实现 160_相交链表 描述 编写一个程序,找到两个 ...

  2. LeetCode算法题-链表类

    1.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. (可以参照第2的merge2List实现) 示例: 输入:1->2->4, 1->3 ...

  3. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  4. 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

    参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...

  5. LeetCode:分割链表【86】

    LeetCode:分割链表[86] 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例 ...

  6. LeetCode:旋转链表【61】

    LeetCode:旋转链表[61] 题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5- ...

  7. LeetCode:奇偶链表【328】

    LeetCode:奇偶链表[328] 题目描述 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地 ...

  8. LeetCode:删除链表中的节点【203】

    LeetCode:删除链表中的节点[203] 题目描述 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val ...

  9. LeetCode初级算法--链表01:反转链表

    LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  10. LeetCode初级算法--链表02:合并两个有序链表

    LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

随机推荐

  1. [转帖]ls命令

    ls(list) 命令可以说是Linux下最常用的命令之一 #ls -l;列出文件的详细信息 #ll 以上两个命令一样,ll是ls -l的简写 #ls -al;列出目录下的所有文件,包括以 . 开头的 ...

  2. Oracle 以及 达梦数据库简单查询所有表行数的存储过程

    1. 今天有一个场景需要查询一个数据库实例下面所有的表的行数. 本来想查询 user_tables 视图 但是发现 这个视图里面 达梦数据库 里面存的是null的.. 百度之后发现一个解决方案是 使用 ...

  3. 记一次flex布局中子项目尺寸不受flex-shrink限制的问题

    预期是写一个如下所示的布局内容: 即有一个固定高度的外部容器,顶部的header已知高度,在header占据了固定高度后,剩下的都分给body部分.因此采用flex布局,header设置flex-sh ...

  4. vue动画appear 实现页面刚展示出来的时候,入场效果

    <style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(80px); } . ...

  5. 【JS 逆向百例】层层嵌套!某加速商城 RSA 加密

    声明 本文章中所有内容仅供学习交流,敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某加速商城登录接口 ...

  6. 无法下载安装文件,请检查internet连接

    win10 vs2019下提示visual studio installer无法下载安装文件,请检查internet连接     1.打开"网络和Internet设置",更改适配器 ...

  7. es从线上库导出数据并导入开发环境

    背景 来了个需求,需要从某个线上es库查询一些数据出来并进行大屏展示.问需求方有没有开发环境的es库,答:没有,说要不直连他们的线上库. 后面想想也行吧,业务方都这么说了,结果开网络的流程被打回了,理 ...

  8. HarmonyOS实战[二]—超级详细的原子化服务体验[可编辑的卡片交互]快来尝试吧

    相关文章: HarmonyOS实战[一]--原理概念介绍安装:基础篇 [本文正在参与"有奖征文|HarmoneyOS征文大赛"活动] 1.创建HarmonyOS应用 选择Java程 ...

  9. 20.6 OpenSSL 套接字分发RSA公钥

    通过上一节的学习读者应该能够更好的理解RSA加密算法在套接字传输中的使用技巧,但上述代码其实并不算完美的,因为我们的公钥和私钥都必须存储在本地文本中且公钥与私钥是固定的无法做到更好的保护效果,而一旦公 ...

  10. 【STL源码剖析】stack_queue底层模拟实现 | 什么是适配器?【超详细的底层注释和解释】

    今天博主继续带来STL源码剖析专栏的第四篇博客了! 今天带来stack和queue的模拟实现!话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构htt ...