Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
null.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
/**
* 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==NULL || headB==NULL)
return NULL;
//Ensure the start point isn't in the cycle;
//Create a cycle in head B;
ListNode* temp = headB;
while(temp->next!=NULL)
{
if(temp == headA)
return headA;
temp = temp->next;
}
ListNode* tailB = temp;
temp->next = headB;
ListNode* slow = headA;
ListNode* fast = headA;
while(fast!=NULL && fast->next!=NULL)
{
slow = slow->next;
fast = fast->next;
fast = fast->next;
if(fast==slow)
break;
}
if(fast == NULL || fast->next==NULL)
{
tailB->next = NULL;
return NULL;
}
fast = headA;
while(fast!=slow)
{
fast = fast->next;
slow = slow->next;
}
tailB->next = NULL;
return slow;
}
};LeetCode--Intersection of Two Linked Lists
原文地址:http://blog.csdn.net/shaya118/article/details/42774681