1. 判断链表相交,并找出相交的第一个节点
package org.jyjiao;
import java.util.*;
public class IsLinkCross {
/*
* 实现功能:判断链表相交,并找出相交的第一个节点 算法1: 1.
* 先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。 2.
* 我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,
* 之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。
*/
public String isLinkListCross1(LinkedList<String> listA,
LinkedList<String> listB) {
int ret = -1;
int lenA = 0, lenB = 0;
Iterator<String> itA = listA.iterator();
while (itA.hasNext()) {
itA.next(); //注意这里,这句不能少
lenA++;
}
Iterator<String> itB = listB.iterator();
while (itB.hasNext()) {
itB.next(); //注意这里,这句不能少
lenB++;
}
itA = listA.iterator();
itB = listB.iterator();
int wait;
if (lenA >= lenB) {
wait = lenA - lenB;
for (int i = 0; i < wait; i++) {
itA.next();
}
} else {
wait = lenB - lenA;
for (int i = 0; i < wait; i++) {
itB.next();
}
}
while (itA.hasNext() && itB.hasNext()) {
String strA = itA.next();
String strB = itB.next();
if (strA.equals(strB)) {
return strA;
}
wait++;
}
return null;
}
/*
* 实现功能:判断链表相交,并找出相交的第一个节点 算法2: 1. 先遍历一个链表,直到尾部,并将每个节点放入一个哈希表中 2.
* 再遍历另外一个链表,如果遍历到的节点在哈希表中,从该节点开始如果每个节点都在哈希表中,则两个链表相交;第一在哈希表中的节点是开始节点
*/
public String isLinkListCross2(LinkedList<String> listA,LinkedList<String> listB){
String ret=null;
HashSet<String> hsetA=new HashSet<String>();
Iterator<String> itA=listA.iterator();
while(itA.hasNext()){
String str=itA.next();
hsetA.add(str);
}
int startIndexB;
for(int i=0;i<listB.size();i++){
if(hsetA.contains(listB.get(i))){
startIndexB=i;
int startIndexA=listA.indexOf(listB.get(i));
while(startIndexA<listA.size()&& startIndexB<listB.size()){
if(listA.get(startIndexA).equals(listB.get(startIndexB))){
startIndexA++;
startIndexB++;
}else{
i=startIndexB;
break;
}
}
if(startIndexA==(listA.size())){
return listB.get(i);
}
}
}
return ret;
}
public static void main(String[] args) {
LinkedList<String> listA = new LinkedList<String>();
LinkedList<String> listB = new LinkedList<String>();
listA.add("one");
listA.add("two");
listA.add("three");
listA.add("four");
listA.add("five");
listA.add("six");
listB.add("seven");
listB.add("eight");
listB.add("three");
listB.add("four");
listB.add("five");
listB.add("six");
// IsLinkCross test1 = new IsLinkCross();
// String retStr = test1.isLinkListCross1(listA, listB);
// if (retStr == null) {
// System.out.println("no cross point");
// } else {
// System.out.println("lists cross at : " + retStr);
// }
IsLinkCross test2 = new IsLinkCross();
String retStr = test2.isLinkListCross2(listA, listB);
if (retStr == null) {
System.out.println("no cross point");
} else {
System.out.println("lists cross at : " + retStr);
}
}
}
2. 判断链表有环
算法1:哈希法,类似问题1的算法2
算法2:一个最经典的办法是 两个指针,一个每次指向下一个 另一个步长为2即指向下一个的下一个 让他俩从头开始一前一后往后遍历,若无环 最后将是慢者追到快者 若有环则是最后是快者“追上”慢者,因为在环中快者可以反超
3. 写一个函数快速找到中间节点的位置
package org.jyjiao;
import java.util.*;
public class LinkMid {
public String getMidItem(LinkedList<String> list){
String retStr=null;
int fast=0,slow=0;
Iterator<String> it1=list.iterator();
Iterator<String> it2=list.iterator();
int i=0,j=0;
while(it1.hasNext()){
it1.next();
if(it1.hasNext()){
it1.next();
}else{
retStr=it2.next();
break;
}
retStr=it2.next();
}
return retStr;
}
public static void main(String[] args){
LinkedList<String> list=new LinkedList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
LinkMid mid=new LinkMid();
String ret=mid.getMidItem(list);
System.out.println("mid item is:"+ret);
}
}
5. 找出链表的倒数第k个节点
算法思想类似求中间节点
分享到:
相关推荐
接着遍历h2,计算每个节点的哈希值并查找map,一旦找到匹配项,即表示两个链表相交。这种方法的时间复杂度降为O(max(length(h1), length(h2))),因为最慢的情况是遍历较长的链表。然而,它需要额外的空间来存储哈希...
在实际应用中,尤其是在大型系统开发过程中,可能会遇到两个链表相交的情况。例如,当两个链表共享部分节点时,如果不加以处理就释放其中一个链表的所有节点,将会导致信息丢失,甚至会影响到另一个与之相交的链表。...
分析与解法 这样的一个问题,也许我们平时很少考虑。但在一个大的系统中,如果出现两个链表相 交的情况,而且释放了其中一个链表的...的两个链表,我们希望在释放一个链表之前知道是否有其他链表跟当前这个链表相交。
1.3.9 如何判断两个链表是否相交
7. **判断链表相交**: - 对于没有环的链表,可以同时从两个链表的头节点开始遍历,直到它们相遇,说明链表相交。 - 如果链表可能有环,可以使用Floyd判断环的方法,同时使用快慢指针,如果快指针最终追上慢指针,...
7. **判断链表相交**: - 对于无环链表,可以同时遍历两个链表,一个从头开始,另一个从潜在的交点开始。如果它们相遇,那么链表相交;如果不相遇,那么链表不相交。如果有环,可以使用Floyd判环法或者双指针法先...
7. **判断链表相交** 如果链表没有环,判断是否相交只需遍历两个链表,记录它们的长度,然后从长度较短的链表的头开始,按照较长链表长度的差值依次比较,直到找到相同的节点。如果有环,需要先判断是否有环,再...
以上就是将二叉树转换为双向链表以及判断和找到两个链表相交节点的基本方法。这些算法在处理链表和二叉树问题时非常实用,特别是在需要保持顺序或寻找特定连接的情况下。理解并掌握这些技术对于提升C++编程能力至关...
**1、判断链表是否有环** **2、寻找环的入口点** **3、计算环的节点数** **4、计算(有环)链表的节点数** **5、找出环中距任意一点最远的节点** **6、判断两个无环链表是否相交** **7、寻找两个链表的相交的节点**
判断链表是否为回文链表 leetcode leetcode-javascript LeetCode 算法练习题解 数据结构与算法 旋转矩阵 零矩阵(编写一种算法,若 M × N 矩阵中某个元素为 0,则将其所在的行与列清零。) 队列-实现 栈-实现 最...
1. **判断链表相交**:给定两个链表,判断它们是否在某个节点相交。可以使用双指针法,让两个指针分别从两个链表的头节点开始,如果链表相交,则最终会指向同一个节点。 2. **找到链表的交点**:如果两个链表相交,...
综上所述,多边形相关算法是图形学中的基础部分,涉及到的面积计算、凹凸性检测、凸包生成以及相交判断都是图形处理的核心技能。理解并能熟练应用这些算法,对于进行2D和3D图形编程至关重要。在实际项目中,这些算法...
6. **判断链表是否相交**: - **方法1**:遍历第一个链表并记录其最后一个节点,然后遍历第二个链表,如果最后的节点与第一个链表的最后一个节点相同,则相交。 - **方法2**:将两个链表连接,如果新链表存在环,...
在本压缩包文件中,我们关注的是一个Java编程相关的学习资源,主要涵盖了LeetCode平台上的第160题——“相交链表”。这是一道经典的算法问题,旨在锻炼和提升程序员对链表操作的理解与处理能力。LeetCode是一个广受...
### 面试题一:判断链表中是否存在环 这个问题可以通过快慢指针的方法解决。创建两个指针,一个快指针每次移动两步,另一个慢指针每次移动一步。如果链表存在环,则快慢指针最终会在环内相遇;否则,快指针会先到达...
如果有环,则两个链表相交,且环的入口即为相交的第一个点。 2. **遍历比较法**:分别遍历两个链表,记录下每个链表的长度。然后让较长的链表先向前移动一定步数(即两链表长度之差),之后两个链表同时以相同速度...
判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null 在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2 思路 以下是问题三的具体解决过程: 如果loop...
- 在判断链表是否相交时,可以用栈存储两个链表的节点,比较栈顶元素来确定交点。 在处理链表问题时,理解链表的基本操作(如遍历、插入、删除)至关重要,同时熟悉不同的算法策略可以帮助我们更高效地解决问题。...