链接如下
思路:
根据题目要求可以看到,题目给了两个链表,判断两个链表是否相交。
1.首先我们判断非空的情况,如果其中一个链表为空,那么该链表必定返回 null
if(headA==null||headB==null){ return null; }
2.判断完特例非空情况之后,我们开始判断普遍情况
题目给了两个链表,那么我们就设置两个指针接收这两个链表的头节点
ListNode prev=headA; ListNode cur=headB;
3. 但是当我们遍历链表的时候,会发现好像只能遍历一次,并且会出现两种情况
情况一:由于两个链表的长度不一,所以我们无法一次循环结束就判断链表是否相交
情况二:在循环判断中,如果我们比的是链表节点中的值会发现,两个链表节点中会出现其中一个值相等,但后面的值不会相等,出现了假相交的情况,这样也不符合题目要求,显然我们在比对过程中,应该比对链表的地址值,而不是链表中的val值
4.那么情况一出现的问题怎么解决呢,我们进行while循环遍历,无论两个链表长度是否相等,当其中一个链表为空时,就把另外一个链表的头节点的地址值赋给该为空的节点值,继续进行循环遍历,直到两个节点的地址值相等。
5.题目要求链表相交的原理是两个链表共用了同一块地址值,而链表又是连续的,所以只要找到第一个地址相同的节点,后续的值和地址值都是相交的。 所以while循环终止的条件应该是两个节点的值相同时,终止循环,并且返回一个该节点的值
代码实现如下
while(prev!=cur){ if(prev==null){ prev=headB; } else if(cur==null){ cur=headA; }else{ cur=cur.next; prev=prev.next; } }
完整代码如下
if(headA==null||headB==null){
return null;
}
ListNode prev=headA;
ListNode cur=headB;
while(prev!=cur){
if(prev==null){
prev=headB;
}
else if(cur==null){
cur=headA;
}else{
cur=cur.next;
prev=prev.next;
}
}
return cur;