- 题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题思路:
先求出两个链表的长度,然后求出长度的差值,把长链表的指针移动到和短链表对齐的位置,再依次对比两个指针的值,如果存在相等的则有交点。
3. 解题代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p = headA;
ListNode *q = headB;
int lengthA = 0;
int lengthB = 0;
while(p != nullptr){
lengthA++;
p = p->next;
}
while(q != nullptr){
lengthB++;
q = q->next;
}
//cout << lengthA << lengthB << '\n' ;
if(lengthA == 0 || lengthB == 0){
return nullptr;
}
p = headA;
q = headB;
/*让p 指向长的链表的表头,这样就能同步后面的操作*/
if(lengthB > lengthA){
swap(lengthB,lengthA);
swap(p,q);
}
int gap = lengthA - lengthB;
while(gap--){
p = p -> next;
}
while(p != nullptr){
if(p == q ){
return p;
}
p = p->next;
q = q->next;
}
return nullptr;
}
};
- tips:
/*让p 指向长的链表的表头,这样就能同步后面的操作*/
if(lengthB > lengthA){
swap(lengthB,lengthA);
swap(p,q);
}
这是我认为这个题解中非常有意思的一段代码,当两个变量不确定谁大谁小的时候,不妨直接先假定一个A大,然后判断A和B的大小,如果B>A则交换A和B的值,这样后面的代码直接可以假定A是大的那个数进行编写。