题目描述
输入两个链表,找出它们的第一个公共结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p = pHead1,q;
while(p != null){
q = pHead2;
while(q != null){
if(p == q)//注意这里
return p;
if(p.next != q.next)
q = q.next;
else
return q.next;
}
p = p.next;
}
return null;
}
}
当两个链表一模一样的时候,直接返回第一个节点即可;否则,固定一个链表的位置,一次和另一个节点的下一个相比较是否相同!
另一种答案:
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p = pHead1,q = pHead2;
int pCount = 0,qCount = 0;
while(p != null){
pCount++;
p = p.next;
}
while(q != null){
qCount++;
q = q.next;
}
int num = Math.abs(pCount - qCount);
if(pCount > qCount){
p = pHead1;
q = pHead2;
}else{
q = pHead1;
p = pHead2;
}
while(num > 0){
p = p.next;
num--;
}
while(p != q){
p = p.next;
q = q.next;
}
return p;
}
}
先遍历一遍链表,得到两个链表的长度,根据它们的差值,先使较长的链表移动差值的长度,然后两个指针一块移动,当两指针的指向元素相同的时候,即为所求!
注意:链表的判断尽量用(p != q)
,而减少使用(p.next != q.next)
的操作,因为后者可能会发生空指针异常!