33.相交链表
题目内容:
代码及思路:
利用双指针的方法,两个一快一慢的指针进行遍历,如果有交点则第一个交点就是我们需要的节点。因此需要完成以下几步:
1.判断长度:
1)对于长度较长的那个链表,用快一点的指针 (先走两者长度差值的步长)
2)对于长度较短的那个链表,赋予较慢的指针
这样在遍历过程中,如果有交点则一定会相遇,否则则无交点.
/**
* 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) {
if(headA==nullptr||headB==nullptr)
return nullptr;
int lengthA=0;
int lengthB=0;
ListNode* p1=headA;
ListNode* p2=headB;
while(p1!=nullptr)
{
p1=p1->next;
lengthA++;
}
while(p2!=nullptr)
{
p2=p2->next;
lengthB++;
}
if(p1!=p2) return nullptr;
if(lengthA>lengthB)
{
for(int i=0;i<lengthA-lengthB;i++)
headA=headA->next;
}
else if(lengthB==lengthA)
{
headA=headA;
headB=headB;
}
else
{
for(int i=0;i<lengthB-lengthA;i++)
headB=headB->next;
}
while(headA!=headB)
{
headA=headA->next;
headB=headB->next;
}
return headA;
}
};