题目描述:
输入两个链表,找出它们的第一个公共结点。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数。
接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开。第二行为第二个链表的所有元素,中间用空格隔开。
输出:
对应每个测试案例,
输出两个链表的第一个公共结点的值。
如果两个链表没有公共结点,则输出“My God”。
样例输入:
5 4 1 2 3 6 7 4 5 6 7 3 3 1 5 7 2 4 7 2 3 1 3 4 5 6
样例输出:
6 7 My God
画图有助于我们理解,画图会发现如果二者有公共结点,则公共节点后面的节点也都是公共节点。用两个辅助栈,将两个链表从头分别压入栈,最后二者出栈,最后一个相同的出栈元素即为公共节点。但这样需要开辟两个栈的空间,实际上,可以不用开辟空间,分别求出二者的长度,求出二者的差dis,而后将指向长的链表的指针先在长链表上走dis步,而两个链表同时走,二者会同时走到第一个公共节点处。
代码
package JvavaDataTest;
import java.util.List;
public class FindFirstCommonNode {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
listNode1.lnNext = listNode2;
ListNode listNode3 = new ListNode(3);
listNode2.lnNext = listNode3;
ListNode listNode4 = new ListNode(4);
listNode3.lnNext = listNode4;
ListNode listNode5 = new ListNode(5);
listNode4.lnNext = listNode5;
ListNode listNode6 = new ListNode(6);
listNode5.lnNext = listNode6;
ListNode listNode7 = new ListNode(7);
ListNode listNode8 = new ListNode(8);
listNode7.lnNext = listNode8;
listNode8.lnNext = listNode4; //这块就是他们的交互点 4
FindFirstCommonNode findFirstCommonNode = new FindFirstCommonNode();
int n = findFirstCommonNode.FindFirstCommonNode(listNode1,listNode7);
System.out.println("交互的节点的值为:"+n);
}
public int FindFirstCommonNode(ListNode pHead1,ListNode pHead2){
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
if(length1 == 0 || length2 == 0){
return 0;
}
ListNode pointLongListNode = null;
ListNode pointShortListNode = null;
int dif = 0;
if(length1 > length2){
pointLongListNode = pHead1;
pointShortListNode = pHead2;
}else{
pointLongListNode = pHead1;
pointShortListNode = pHead2;
}
dif = Math.abs(length1 - length2);
for (int i = 0;i<dif;i++){
pointLongListNode = pointLongListNode.lnNext;
}
while(pointLongListNode != null
&& pointShortListNode != null
&& pointLongListNode != pointShortListNode
){
pointLongListNode = pointLongListNode.lnNext;
pointShortListNode = pointShortListNode.lnNext;
}
return pointLongListNode.val;
}
private int getLength(ListNode ln){
if(ln == null){
return 0;
}
ListNode head = ln;
int len = 0;
while(head.lnNext != null){
head = head.lnNext;
len++;
}
return len;
}
}
class ListNode{
int val = 0;
ListNode lnNext = null;
public ListNode(int val){
this.val = val;
}
}
结果: