面试题37:两个链表的第一个公共结点

来源:互联网 发布:方舟数据修改 编辑:程序博客网 时间:2024/05/13 00:43
/* * 面试题37:两个链表的第一个公共结点 题目:输入两个链表,找出他们的第一个公共结点。 *  * 从定义可以看出,这是单向链表。如果有公共结点,之后他们的所有结点都是重合的,不可能分叉,拓扑形状像一个Y而不是X。 * 思路1:可以把两个链表的结点放入两个栈,这样两个链表的尾结点就是栈顶,接下来比较栈顶结点是否相同。 * 直到找到最后一个相同的结点。空间复杂度和时间复杂度都是O(m+n). * 思路2:首先遍历两个链表得到它们的长度,得出哪个链表较长,长几个结点。第二次遍历的时候, * 较长的链表先走若干步,接着同时遍历两个链表,找到第一个相同的结点就是第一个公共结点。 *  * 首先定义一个返回链表长度的方法 */public static int GetListLength(Node head){int nLength=0;Node pNode=head;while(pNode!=null){++nLength;pNode=pNode.next;}return nLength;}public static Node getFirstMeetNode(Node h1,Node h2){if(h1==null||h2==null)return null;int len1=GetListLength(h1);int len2=GetListLength(h2);int nLengthDif=len1-len2;Node pListHeadLong=h1;Node pListHeadShort=h2;if(nLengthDif<0){nLengthDif=len2-len1;pListHeadLong=h2;pListHeadShort=h1;}for(int i=0;i<nLengthDif;++i)pListHeadLong=pListHeadLong.next;while((pListHeadLong!=null)&&(pListHeadShort!=null)&&(pListHeadLong!=pListHeadShort)){pListHeadLong=pListHeadLong.next;pListHeadShort=pListHeadShort.next;}Node pFirstMeetNode=pListHeadLong;return pFirstMeetNode;}

0 0
原创粉丝点击