剑指offer-两个链表的第一个公共节点

题目延伸:编程之美中的求两个节点是否相交:将两个节点串在一起,若有节点,串在一起的节点就会出现环,利用一二不长不等,两个节点在环中必然相遇。


本题描述:输入两个链表,找出它们的第一个公共结点。


分析:

一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。


public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
		int length1=getListLength(pHead1);
		int length2=getListLength(pHead2);
		int lengthDif=length1-length2;
		ListNode plong=pHead1;
		ListNode pshort=pHead2;
		if(length2>length1){
			plong=pHead2;
			pshort=pHead1;
			lengthDif=length2-length1;
		}
		for(int i=0;i<lengthDif;i++){
			plong=plong.next;
		}
		while(plong!=null&&pshort!=null&(plong!=pshort)){
			plong=plong.next;
			pshort=pshort.next;
		}
		return plong;
    }

	private int getListLength(ListNode pHead) {
		// TODO Auto-generated method stub
		int length=0;
		ListNode node=pHead;
		while(node!=null){
			length++;
			node=node.next;
		}
		return length;
	}
}




你可能感兴趣的:(java,算法,字符串,遍历)