题目描述:输入两个链表,返回它两的第一个公共节点
详情参考https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/
比如,如下两题分别返回c1和null
- 当两个链表长度相等时,从头结点开始同时移动两个链表的指针,如果两个指针相同则这个节点就是两个链表的相交节点,如果移动到末尾仍然没有相交节点那么这两个链表不相交。
- 当两个链表长度不相等时,可以通过构造两条相同长度的链表来实现,具体做法如下图所示:
于是有如下代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1, p2;
p1 = headA; p2 = headB;
//都为空则返回空
if(p1 == null || p2 == null)
return null;
//没有到达链表的末尾
while(p1 != null || p2 != null){
//两节点相同则返回
if(p1 == p2)
return p1;
//p1为空,需要走p2走过的节点,注意此时p1走了一步空节点,少走了一步
if(p1 == null)
p1 = headB;
//p2为空,需要走p1走过的节点
else if(p2 == null)
p2 = headA;
//需要在下一步再走,因为当前节点还没有判断
else{
p1 = p1.next;
p2 = p2.next;
}
}
return null;
}
上面代码等价于:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1, p2;
p1 = headA; p2 = headB;
//都为空则返回空
if(p1 == null || p2 == null)
return null;
//当两个节点不相等
while(p1 != p2){
p1 = p1 == null ? headB : p1.next;
p2 = p2 == null ? headA : p2.next;
}
return p1;
}