Leetcode.02.07.链表相交
https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
思路:让长链表的遍历指针移动到与短链表相同的位置。然后开始循环判断这两个链表指针是否相等,如果相等,返回该指针,不相等就返回NULL
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode*curA=headA;
ListNode*curB=headB;
int lenA=0, lenB=0;
//求链表长度
while(curA!=NULL){
lenA++;
curA=curA->next;
}
while(curB!=NULL){
lenB++;
curB=curB->next;
}
curA=headA;
curB=headB;
//让A为较长链表
if(lenB->lenA){
swap(curA,curB);
swap(lenA,lenB);
}
//循环遍历链表A
int gap=lenA-lenB;
while(gap--){
curA=curA->next;
}
//循环比较指针
while(curA!=NULL){
if(curA=curB){
return curA;
}
else{
curA=curA->next;
curB=curB->next;
}
}
return NULL;
}
};
//注意两个链表的交点是结点相同,而不是节点的值相同;