两个链表中的第一个公共结点

题目

输入两个链表,找出他们的第一个公共节点。下面第一个公共节点便是40。

1->2->3-----\

>40->50

10->20->30----/

思路

看到栈就忽然恍然大悟,然后在看到类似快慢指针,更大悟。

思路一:

分别遍历第一条链表和第二条链表,将其每个节点分别存入两个栈,然后依次出栈,最后一个相同的的栈顶元素就是第一个公共节点。

	public static LinkListNode findtheFirstNode(LinkListNode head1,LinkListNode head2)
	{
		Stack<LinkListNode> st1 = new Stack<LinkListNode>();
		Stack<LinkListNode> st2 = new Stack<LinkListNode>();

		LinkListNode temp;
		for(temp=head1;temp!=null;temp=temp.next)
			st1.push(temp);
		for(temp= head2;temp!=null;temp=temp.next)
			st2.push(temp);

		LinkListNode result = null;
		while(st1.peek() == st2.peek())
		{
			result = st1.pop();
			st2.pop();
		}

		return result;
	}

思路二:

类似于判断链表是否有环的快慢指针,我们先求出两个链表的长度差多少,然后让长链表的指针先走多少,然后两个指针一块走,直到两个指针指向的值相等,便是第一个公共节点。

       public static LinkListNode findFirstSameNode2(LinkListNode head1,LinkListNode head2)
	{
		LinkListNode result = null;
		int countOne = 0;
		int countTwo = 0;
		for(LinkListNode p = head1 ; p!=null ;p=p.next)
			countOne++;
		for(LinkListNode p = head2 ; p!=null ;p=p.next)
			countTwo++;

		LinkListNode pLonghead=head1;
		LinkListNode pShorthead = head2;
		int diff = countOne - countTwo;
		if(countOne < countTwo)
		{
			pLonghead = head2;
			pShorthead = head1;
			diff =countTwo-countOne ;
		}

		for(int i = 0;i<diff ;++i)
		{
			pLonghead = pLonghead.next;
		}

		while(pLonghead!=null && pShorthead!=null && pLonghead != pShorthead)
		{
			pLonghead = pLonghead.next;
			pShorthead = pShorthead.next;
		}

		return pLonghead;
}

版权声明:本文为博主原创文章,转载请注明出处。

时间: 2024-10-11 20:12:56

两个链表中的第一个公共结点的相关文章

两个链表的第一个公共结点-剑指Offer

两个链表的第一个公共结点 题目描述 输入两个链表,找出它们的第一个公共结点. 思路 若用暴力比较,一个个的节点比较,时间复杂度为O(n2),不可取 根据题意,两个链表若有公共节点,最终要连起来,像一个Y形,所以我们从后往前遍历,但是单向链表只能从前往后,所以这符合“先进后出”,可以用两个辅助栈 也可以不用辅助栈,我们先将两个链表遍历一遍,获取长度大小,然后从长的先开始遍历,到达相等长度后同时开始遍历,直到遍历到相等的节点 这个问题可以类比到求二叉树中两个叶结点的最低公共祖先的问题 代码 /* p

剑指offer (37) 两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点 如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部 如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在 如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等" 我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到 ListN

剑指offer(四十四)之两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 思路分析:将其中一个链表结点,存进HashMap中,将利用ContainsKey()进行判断是否有公共结点 代码1: <span style="color:#6600cc;">import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode

剑指offer:两个链表的第一个公共结点

题目描述输入两个链表,找出它们的第一个公共结点. # -*- coding: utf-8 -*- # @Time : 2019-07-12 22:20 # @Author : Jayce Wong # @ProjectName : job # @FileName : findFirstCommonNode.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce class Lis

剑指offer七:两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点. import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode current1 = pHead1; ListNode current2 = pHead2; HashMap<ListNode,Integer> hashMap = new HashMap<ListN

两个链表第一个公共结点

题目:输入两个链表,找出它们的第一个公共节点.链表的定义如下: struct ListNode { int m_nValue; ListNode *m_pNext; }; 思路1:采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点.如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点.而通常蛮力并不是好的方法. 思路2:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多

两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 首先遍历俩个链表得到它们的长度,以及长的链表多几个结点.在第二次遍历的时候,在较长的链表先走长度之差步,接着再同时在俩个链表遍历,找到的第一个相同的结点就是她们的第一个公共结点 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: int length(

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i