链表相交--Java
·
以下内容是从网站中学习的~~~
给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。
图示两个链表在节点c1开始相交:

题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例1:

示例2:

示例3:

思路
简单来说,就是求两个链表交点节点的指针。
这里同学们要注意,交点不是数值相等,而是指针相等。
为了方便举例,假设节点元素数值相等,则节点指针相等。
看如下两个链表,目前curA指向链表A的头节点,curB指向链表B的头节点:

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
否则循环退出返回空指针。
public class Solution {
public ListNode getIntersectionNode(ListNode headA,ListNode headB){
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0;
int lenB = 0;
while(curA != null){ //求链表A的长度
lenA++;
curA = curA.next;
}
while(curB != null){ //求链表B的长度
lenB++;
curB = curB.next;
}
curA = headA;
curB = headB;
//让curA为最长链表的头,lenA为其长度
if(lenB > lenA){
// swap(lenA,lenB);
int tempLen = lenA;
lenA = lenB;
lenB = tempLen;
//swap(curA,curB);
ListNode tempNode = curA;
curA = curB;
curB = tempNode;
}
//求长度差
int gap = lenA - lenB;
//让curA和curB在同一起点上(末尾位置对齐)
while(gap-- > 0){
curA = curA.next;
}
//遍历curA和curB,遇到相同则直接返回
while(curA != null){
if(curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}
时间复杂度:O(n + m)
空间复杂度:O(1)
更多推荐


所有评论(0)