解题思路:
先将两个链表构建成一个环,定义两个快慢指针,当它们相遇时,将fast指针从头结点往后遍历,每次走一步,当这两个指针再次相遇时,该节点就是相交节点。
/**
* 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 || !headB) return NULL;
//先将两个链表连起来,构造一个环
ListNode* tmp = headA;
while(tmp && tmp->next)
tmp = tmp->next;
tmp->next = headB;
//headA作为链表的头结点
ListNode* slow = headA;
ListNode* fast = headA;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow == fast) break;
}
if(!fast || !fast->next) {
tmp->next = NULL; //把链表结构复原
return NULL; //没有相交节点
}
//让fast指针指向头结点
fast = headA;
while(fast != slow){
// cout<< slow->val;
slow = slow->next;
fast = fast->next;
}
tmp->next = NULL; //把链表结构复原
return fast;
}
};