题目:
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:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
/**
* 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(NULL == headA || NULL == headB) return NULL;
//分别遍历两个链表到最后一个节点并记录链表长度lenA和lenB
ListNode *pA = headA;
ListNode *pB = headB;
int lenA = 1;
int lenB = 1;
while(pA->next){
++lenA;
pA = pA->next;
}
while(pB->next){
++lenB;
pB = pB->next;
}
//如果最后一个节点相等,则相交,否自,不相交
if(pA != pB) return NULL;
//两遍历指针都指向各自链表的第一个节点,较长链表的那个指针先走abs(lenA-lenB)步,然后两个指针同步后移,第一次指向同一个节点的时候他们所指的那个节点即为所求
ListNode *pLong = headA;
ListNode *pShort = headB;
int lenDiff = abs(lenA - lenB);
if(lenB > lenA){
pLong = headB;
pShort = headA;
}
for(int i = 0; i < lenDiff; ++i) pLong = pLong->next;
while(pLong != pShort){
pLong = pLong->next;
pShort = pShort->next;
}
return pLong;
}
};