输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:两个链表的公共节点,因为每个节点只有一个next,所以如果两个链表有公共节点的话,那么从该公共节点开始后面的所有节点相同,则可通过得到两个链表的长度,找到长链表与短链表长度相同的一个起点,逐一与短链表的节点进行比较。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//得到两个链表的长度
int sizeA = getSize(pHead1);
int sizeB = getSize(pHead2);
ListNode pos1 = pHead1;
ListNode pos2 = pHead2;
int start=0; //找到开始比较的起点
if(sizeA>sizeB){
//链表1较长先行
start = sizeA-sizeB;
for(int i=0;i<start;i++){
pos1 = pos1.next;
}
}else{
start = sizeB-sizeA;
for(int i=0;i<start;i++){
pos2 = pos2.next;
}
}
//开始比较两个链表是否有共同节点
while(pos1!=null){
if(pos1==pos2){
return pos1;
}
pos1 = pos1.next;
pos2 = pos2.next;
}
return null;
}
public int getSize(ListNode head){
int size=0;
ListNode p = head;
while(p!=null){
size++;
p = p.next;
}
return size;
}
}