目录
一、背景
判断两个链表是否相交是C++中一个常见的问题。判断两个链表是否相交,指的是判断两个单链表是否存在至少一个公共节点。如果存在公共节点,那么从这个公共节点开始,两个链表后续的所有节点都是相同的,因为单链表的每个节点只有一个指向下一个节点的指针。
二、原理
2.1、链表相交的特点
如果两个链表相交,那么从相交节点开始,它们的后续节点是完全相同的。也就是说,相交节点及其之后的节点在内存中是共享的。
2.2、关键思路
可以通过遍历两个链表,找到它们的长度,然后让较长的链表先走差值步,使得两个链表剩余的长度相同,再同时遍历两个链表,判断是否有相同的节点。
三、实现思路
3.1、计算两个链表的长度
分别遍历两个链表,统计它们的节点个数。
3.2、计算长度差
用较长链表的长度减去较短链表的长度,得到长度差 diff。
3.3、让较长链表先走 diff 步
从较长链表的头节点开始,向后移动 diff 个节点。
3.4、同时遍历两个链表
从当前位置开始,同时遍历两个链表,比较每个节点是否相同。如果找到相同的节点,则说明两个链表相交;如果遍历到链表末尾都没有找到相同的节点,则说明两个链表不相交。
四、代码示例
4.1、代码示例1
#include "stdafx.h"
#include <iostream>
#include <strin