题目:
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
首先,我们要先判断极端条件,比如任何一条链表为空都会让整个程序直接返回null;
然后我们需要考虑的是A和B链条不重合的节点数量是否相同,如果相同,那自然是万事大吉,几步遍历就找到了。可若是节点不同,那么我们可以观察到:
遍历完“A链表加上B链表的未重合部分”和“B链表加上A链表的未重合部分的距离是一样的”(这句话可以细品)
所以我们可以设置一个pA指针指向headA头节点,设置一个pB指针指向headB头节点,开始遍历对比(pA是否等于pB):
如果pA先遍历到尽头(即pA == null时),则将headB头节点再赋给pA;
如果pA先遍历到尽头(即pB == null时),则将headA头节点再赋给pB;
最后一定会在第一个相交节点相遇(pA == pB);
这道题做到一半的时候我整个人都泪目了,这不就是人类社会中的爱情吗?虽然当前路口我们可能会错过,但是只要我们愿意一直走下去,终有一天我们会同时在这个路口相遇~
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode pA = headA,pB = headB;
while(pA != pB){
if(pA != null){
pA = pA.next;
}else{
pA = headB;
}
if(pB != null){
pB = pB.next;
}else{
pB = headA;
}
}
return pA;
}
}