题目
*输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点c1开始相交。
解题思路
(1)利用两个指针,初始时分别指向两个链表头节点。遍历两个链表,分别计算出各自链表长度,求出长度的差值count。
(2)长链表的头指针先移动count步,即遍历count个节点,然后两个链表的头指针开始同步移动。当两个指针指向同一个节点时,该节点则为第一个公共节点。
时间复杂度:O(3n)。
下面是java代码描述
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//两链表长度初始化为0
int len1 = 0;
int len2 = 0;
//定义两个指针,指向两个链表头节点
ListNode p1 = headA;
ListNode p2 = headB;
//求出链表1的长度
while (p1 != null){
p1 = p1.next;
len1++;
}
//求出链表2的长度
while (p2 != null){
p2 = p2.next;
len2++;
}
//计算两个链表的长度差值
int count = len1 > len2 ? len1-len2 : len2-len1;
//哪个链表长,哪个就先走count步
if(len1>len2){
for(int i=0;i<count;i++){
headA = headA.next;
}
}else {
for(int i =0;i<count;i++){
headB = headB.next;
}
}
//遍历,直到headA==headB,注意要求的是地址相同,而不是节点的val值相同
while (headA!=null && headB!=null && headA!=headB){
headA = headA.next;
headB = headB.next;
}
//此时的headA或headB就是第一个公共节点
return headA;
}
以上就是我关于此题的思路和代码描述,是比较简单易懂的方法。代码小白,如写的有不对不妥的地方,虚心接受指正,向大家学习,一起进步。