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.
题意:
求得两个链表的交汇点;
思路:
1. 两个指针同时对两个链表分别遍历,当指针相同时说明存在交汇点
2. 当两个指针遍历到末尾且均不相同时说明不存在交汇点
3. 当指针A遍历至尾时,将其重定向至B链表头,继续遍历,相同地将B重定向至A,这样即便两个链表长度不一时,遍历速度快的那个指针总
能追上慢者
时间复杂度O(M+N),空间上使用了四个临时指针
:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *pa = headA,*pb = headB;
if(!pa || !pb)
{
return NULL;
}
struct ListNode *pa_last = NULL, *pb_last = NULL;
while(pa != pb)
{
if(pa_last == NULL && pa->next == NULL)/* Last of PA */
{
pa_last = pa;
}
if(pb_last == NULL && pb->next == NULL)/* Last of PB */
{
pb_last = pb;
}
if(pa_last && pb_last && pa_last != pb_last)
{
return NULL;/* end of two list not equal,No intersection */
}
pa = pa->next;
pb = pb->next;
if(pa == NULL){
pa = headB;
}
else if(pb == NULL){
pb = headA;
}
}
return pa;
}