不考虑带环的情况...
这里面其实包含了两个问题:判断链表相交和找两个相交链表的第一个公共点。
思路:首先需要理解的是若两个链表相交,则
一定是呈Y型。所以我们分别遍历两个链表,找到最后一个节点,若它们相同,则一定相交。然后我们从后往前考虑,假设两个链表有n个公共节点,两个链表的长分别为l和m(设l>m),那么我们先让较长的链表遍历l-m个。两个链表剩余部分长度是相等的(m),则同步遍历比较,若相同,则输出。
import com.linkedlist.LinkedListReverse.Node;
/**
* 打印相交链表的公共节点
*
* @author aaron-han
*
*/
public class LinkedListCommonNodes {
public static void main(String[] args) {
Node a = new Node("NodeA");
Node b = new Node("NodeB");
Node c = new Node("NodeC");
Node d = new Node("NodeD");
Node e = new Node("NodeE");
Node f = new Node("NodeF");
Node g = new Node("NodeG");
Node h = new Node("NodeH");
// a->f->g->h
a.next = f;
f.next = g;
g.next = h;
// b->c->d->e->f->g->h
b.next = c;
c.next = d;
d.next = e;
e.next = f;
f.next = g;
g.next = h;
System.out.println(isIntersected(a, c));
printCommonNode(a, c);
}
// 判断是否相交
public static boolean isIntersected(Node a, Node b) {
Node headA = a;
Node headB = b;
while (headA.next != null) {
headA = headA.next;
}
while (headB.next != null) {
headB = headB.next;
}
if (headA == headB) {
return true;
}
return false;
}
// 打印公共节点
public static void printCommonNode(Node a, Node b) {
int lengthA = getListLength(a);
int lengthB = getListLength(b);
Node longerList = a;
Node shorterList = b;
int lengthDiff = lengthA - lengthB;
if (lengthDiff < 0) {
longerList = b;
shorterList = a;
lengthDiff = lengthB - lengthA;
}
// 使较长的链表先遍历lengthDiff个
for (int i = 0; i < lengthDiff; i++) {
longerList = longerList.next;
}
// 此时等长,同步遍历
while (longerList != null && shorterList != null) {
if (longerList == shorterList) {
System.out.println(longerList.name);
}
longerList = longerList.next;
shorterList = shorterList.next;
}
}
public static int getListLength(Node node) {
int length = 0;
if (node == null) {
return length;
}
while (node != null) {
node = node.next;
length++;
}
return length;
}
}
分享到:
相关推荐
1. **建立双头链表及求公共结点.cpp**:这个练习涉及创建一个具有头尾两个指针的链表,并寻找两个链表的公共节点。双头链表在处理双向遍历或合并操作时非常有用。公共结点的查找通常用于解决两个链表相交的问题,...
打印两个链表的公共部分 删除单链表和双链表倒数第K个节点 删除链表的中间节点和a/b处的节点 腕单向链表和链 部分单向链表 环形单链表的约瑟夫问题 一个鉴定链表是否为回文结构 将单向链某值分割成小表、送、按右边...
2.4 相交链表:集合也可以用来处理链表问题,如寻找两个链表的交点,通过将链表的节点值放入集合,可以轻松地确定它们是否有公共部分。 2.5 环形链表:虽然环形链表的问题通常用双指针解决,但在某些情况下,集合也...
在编程面试中,经常会出现涉及到链表操作的问题,其中寻找两个链表的第一个公共节点是一个经典题目。这道题目最初的来源是LeetCode上的《剑指 Offer》专项,其中编号为52。此题不仅考察面试者对链表结构的理解,更...
4. **判断两个链表是否相交**:使用两个指针分别从两个链表的头节点开始遍历,若相遇则说明链表相交,相交节点即为相遇点。如果一个链表遍历完后另一个仍在继续,说明不相交。 5. **二叉树中两个节点的最小距离**:...
代码中包含单链表的常用操作,主要实现以下六个算法: ...2.链表相交或求公共起始节点 3.求链表倒数第n个节点 4.删除单个节点 5.判断链表是否有环 6.将2个递增的链表合并为递减链表 并全部调试通过。
本文详细介绍了C++二级公共基础知识中的关键知识点,包括算法的概念与复杂度、数据结构的定义及分类、栈与线性链表的使用、树与二叉树的特性及遍历方法、二分查找法与冒泡排序法等。对于备考C++二级的学生而言,掌握...
- 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最长递增子序列(LIS):找到数组中最长的递增子序列。 - 矩阵链乘法:通过动态规划优化矩阵乘法的计算顺序,降低运算次数。 5. **字符串处理**:...
- 最长公共子序列:寻找两个序列中不相交的最长子序列。 - 矩阵链乘法:减少计算矩阵乘法的运算次数。 - 最短路径问题:如Floyd-Warshall算法、Dijkstra算法和Bellman-Ford算法。 4. 树与图算法: - 二叉树操作...
- 最长公共子序列(LCS):找出两个序列中长度最长的不相交子序列。 - 矩阵链乘法:计算多个矩阵相乘的最小代价。 5. **数据结构**: - 数组:基础数据结构,支持随机访问但插入和删除操作较慢。 - 链表:每个...
**知识点**:本题考查如何判断两个链表是否存在公共节点。 **解题思路**: 1. **双指针法**:使用两个指针,一个从第一个链表开始,另一个从第二个链表开始。 2. **同步移动**:当一个指针到达链表末尾时,将其移动...
q160_相交链表 q206_反转链表 双指针遍历/滑动窗口 q3_无重复字符的最长子串 q11_盛最多水的容器 q15_三数之和 q16_最接近的三数之和 q26_删除排序数组中的重复项 q42_接雨水 q121_买卖股票的最佳时机 q209_长度最小...
8. **最小生成树**:找到连接所有节点的最小权值树,常用Prim和Kruskal算法。 9. **最短路径**:Dijkstra算法(非负权重)、Bellman-Ford算法(负权重)和Floyd-Warshall算法(全源最短路径)。 10. **最大流**:...
《算法之美:Python语言实现》是一本深入探讨算法在Python编程中的应用的书籍。通过实践性的实验代码,读者可以深入理解各种算法的工作原理,并学习如何用Python高效地实现它们。以下是对书中部分重要算法的概览和...
- 最长公共子序列:寻找两个序列最长的不相交子序列。 - 矩阵链乘法:优化矩阵乘法的计算过程,减少运算次数。 5. **字符串算法**: - KMP算法:高效地进行模式匹配,避免不必要的回溯。 - Rabin-Karp算法:...
"二级公共基础知识计算机基础知识(必看)资料.pdf" 本资源主要讲解了计算机基础知识中的数据结构和算法两个方面。下面是对每个章节的详细说明: 1.1 算法 算法是指一系列解决问题的清晰指令。它具有四个基本特征:...
若需要找到相交的第一个节点,可以先遍历两个链表,记录各自长度,然后从长度较短的链表头开始,向较长的链表方向移动对应步数,直到找到公共节点。 8. **非算法类思维题**: 这些题目主要考察逻辑思维和问题解决...
《C常用算法程序集》是针对C语言编程者的一份宝贵资源,包含了大学阶段学习算法时经常遇到的各种经典实例。这份压缩包旨在帮助学生...通过阅读和理解这些代码,可以加深对算法原理的理解,为解决实际问题打下坚实基础。
- 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最短路径问题:如Floyd-Warshall算法求解所有节点间最短路径。 5. 数学优化算法: - 最小二乘法:通过拟合数据点来找出最佳直线或曲线模型。 - ...