牛客-两个链表的第一个公共节点
1.题目描述
2.题目链接
两个链表的第一个公共结点_牛客题霸_牛客网
3.代码解答
public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {int len1=0,len2=0,len=0;ListNode cur1=pHead1,cur2=pHead2;if(pHead1==null||pHead2==null){return null;}if(pHead1==pHead2){return pHead1;}while(cur1!=null){len1++;cur1=cur1.next;}cur1=pHead1;while(cur2!=null){len2++;cur2=cur2.next;}cur2=pHead2;if(len1>len2){len=len1-len2;while(len!=0){cur1=cur1.next;len--;}}else if(len1<len2){len=len2-len1;while(len!=0){cur2=cur2.next;len--;}}while(cur1!=null&&cur2!=null){if(cur1==cur2){return cur1;}cur1=cur1.next;cur2=cur2.next;}return null;}
}
4.解题思路
题目要求给出两个链表,找到他们的相交节点并返回该节点。如果两条链表不想交,就返回空值。
我们可以先分别遍历两条链表来得出它们各自的长度。
又知,两条链表相互之后,一模一样。长度自然也一样,所有两条链表的长度差只能存在前半部分(两条链表未相交时)。
我们可以先让较长的链表走差值步,这时两条链表剩下的长度一样。再依次移动双指针,直到双指针节点一样,返回该节点。
5.代码细节
1)先判断后移动双指针
while(cur1!=null&&cur2!=null){if(cur1==cur2){return cur1;}cur1=cur1.next;cur2=cur2.next;}
如果我们在移动完较长链表的指针后,两条链表已经相交,我们不先判断if条件,就会错过。