Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

1
2
3
4
5
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.
题意

找到两个链表中相交的点

答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* p1 =headA;
ListNode* p2 =headB;
if(p1==NULL||p2==NULL) return NULL;
//if(p1==p2) return p1;
while(p1!=p2)
{
p1=p1->next;
p2=p2->next;
if(p1==p2) return p1;
if(p1==NULL) p1 =headB;
if(p2==NULL) p2 =headA;
}
return p1;
}
};

思路

思路十分巧妙,设置两个指针分别指向第一个链表和第二个链表,然后同时往前,当p1 遍历A到头后去遍历B, p2 遍历B到头后去遍历A. 这样两个指针遍历到的距离就相同了,第一个相等的点就是焦点.