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

题目

输入两个链表,找出他们的第一个公共节点。下面第一个公共节点便是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;
}





你可能感兴趣的:(java,剑指offer)