`
aaron-han
  • 浏览: 27017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法基础之打印相交链表的公共节点

阅读更多
不考虑带环的情况...
这里面其实包含了两个问题:判断链表相交和找两个相交链表的第一个公共点。
思路:首先需要理解的是若两个链表相交,则一定是呈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;
	}

}

0
0
分享到:
评论

相关推荐

    c++基础练习之链表数据结构.zip

    1. **建立双头链表及求公共结点.cpp**:这个练习涉及创建一个具有头尾两个指针的链表,并寻找两个链表的公共节点。双头链表在处理双向遍历或合并操作时非常有用。公共结点的查找通常用于解决两个链表相交的问题,...

    这是Kotlin语言版本的 Android 客户端本地化算法展示 Java 语言编写的面试算法_kotlin_代码_下载

    打印两个链表的公共部分 删除单链表和双链表倒数第K个节点 删除链表的中间节点和a/b处的节点 腕单向链表和链 部分单向链表 环形单链表的约瑟夫问题 一个鉴定链表是否为回文结构 将单向链某值分割成小表、送、按右边...

    《数据结构与算法 LeetCode刷题宝典》.docx

    2.4 相交链表:集合也可以用来处理链表问题,如寻找两个链表的交点,通过将链表的节点值放入集合,可以轻松地确定它们是否有公共部分。 2.5 环形链表:虽然环形链表的问题通常用双指针解决,但在某些情况下,集合也...

    11道数据结构和算法设计与分析习题

    4. **判断两个链表是否相交**:使用两个指针分别从两个链表的头节点开始遍历,若相遇则说明链表相交,相交节点即为相遇点。如果一个链表遍历完后另一个仍在继续,说明不相交。 5. **二叉树中两个节点的最小距离**:...

    单链表操作算法合集

    代码中包含单链表的常用操作,主要实现以下六个算法: ...2.链表相交或求公共起始节点 3.求链表倒数第n个节点 4.删除单个节点 5.判断链表是否有环 6.将2个递增的链表合并为递减链表 并全部调试通过。

    c++二级公共基础知识考点归纳整理

    本文详细介绍了C++二级公共基础知识中的关键知识点,包括算法的概念与复杂度、数据结构的定义及分类、栈与线性链表的使用、树与二叉树的特性及遍历方法、二分查找法与冒泡排序法等。对于备考C++二级的学生而言,掌握...

    [剑指-Offer] 52. 两个链表的第一个公共节点(思维、快慢指针、巧妙解法)

    本题是关于链表操作的问题,目标是找到两个链表的首个公共节点。题目给出了两种解法,一种是遍历+快慢指针的常规解法,另一种是利用思维+快慢指针的巧妙解法。 1. **常规解法**: 这种方法首先遍历两个链表,分别...

    常用算法程序集源代码

    - 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最长递增子序列(LIS):找到数组中最长的递增子序列。 - 矩阵链乘法:通过动态规划优化矩阵乘法的计算顺序,降低运算次数。 5. **字符串处理**:...

    java算法大全源码包

    - 最长公共子序列:寻找两个序列中不相交的最长子序列。 - 矩阵链乘法:减少计算矩阵乘法的运算次数。 - 最短路径问题:如Floyd-Warshall算法、Dijkstra算法和Bellman-Ford算法。 4. 树与图算法: - 二叉树操作...

    Java常见算法大全

    - 最长公共子序列(LCS):找出两个序列中长度最长的不相交子序列。 - 矩阵链乘法:计算多个矩阵相乘的最小代价。 5. **数据结构**: - 数组:基础数据结构,支持随机访问但插入和删除操作较慢。 - 链表:每个...

    算法面试经典 100题

    **知识点**:本题考查如何判断两个链表是否存在公共节点。 **解题思路**: 1. **双指针法**:使用两个指针,一个从第一个链表开始,另一个从第二个链表开始。 2. **同步移动**:当一个指针到达链表末尾时,将其移动...

    LeetCode题目分类与面试问题整理,附带所有java算法代码

    q160_相交链表 q206_反转链表 双指针遍历/滑动窗口 q3_无重复字符的最长子串 q11_盛最多水的容器 q15_三数之和 q16_最接近的三数之和 q26_删除排序数组中的重复项 q42_接雨水 q121_买卖股票的最佳时机 q209_长度最小...

    ACM :关于acm比赛常用的算法大全(word版本)

    8. **最小生成树**:找到连接所有节点的最小权值树,常用Prim和Kruskal算法。 9. **最短路径**:Dijkstra算法(非负权重)、Bellman-Ford算法(负权重)和Floyd-Warshall算法(全源最短路径)。 10. **最大流**:...

    算法之美python语言实现实验代码.zip

    《算法之美:Python语言实现》是一本深入探讨算法在Python编程中的应用的书籍。通过实践性的实验代码,读者可以深入理解各种算法的工作原理,并学习如何用Python高效地实现它们。以下是对书中部分重要算法的概览和...

    java 算法大全 源码

    - 最长公共子序列:寻找两个序列最长的不相交子序列。 - 矩阵链乘法:优化矩阵乘法的计算过程,减少运算次数。 5. **字符串算法**: - KMP算法:高效地进行模式匹配,避免不必要的回溯。 - Rabin-Karp算法:...

    二级公共基础知识计算机基础知识(必看)资料.pdf

    "二级公共基础知识计算机基础知识(必看)资料.pdf" 本资源主要讲解了计算机基础知识中的数据结构和算法两个方面。下面是对每个章节的详细说明: 1.1 算法 算法是指一系列解决问题的清晰指令。它具有四个基本特征:...

    (完整版)数据结构与算法面试题80道.docx

    若需要找到相交的第一个节点,可以先遍历两个链表,记录各自长度,然后从长度较短的链表头开始,向较长的链表方向移动对应步数,直到找到公共节点。 8. **非算法类思维题**: 这些题目主要考察逻辑思维和问题解决...

    C常用算法程序集.rar

    《C常用算法程序集》是针对C语言编程者的一份宝贵资源,包含了大学阶段学习算法时经常遇到的各种经典实例。这份压缩包旨在帮助学生...通过阅读和理解这些代码,可以加深对算法原理的理解,为解决实际问题打下坚实基础。

    常用算法,常用算法有哪些,matlab源码.zip

    - 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最短路径问题:如Floyd-Warshall算法求解所有节点间最短路径。 5. 数学优化算法: - 最小二乘法:通过拟合数据点来找出最佳直线或曲线模型。 - ...

Global site tag (gtag.js) - Google Analytics