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.
方法:计算两个链表的长度差len,然后让长的先走len长度,后面2个链表同步走找重合的节点即可。
/**
* 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) {
int lenA=0,lenB=0;
ListNode *tmpA=headA,*tmpB=headB;
while(tmpA!=NULL)
{
lenA++;
tmpA=tmpA->next;
}
while(tmpB!=NULL)
{
lenB++;
tmpB=tmpB->next;
}
int len;
len=lenA>=lenB?(lenA-lenB):(lenB-lenA);
ListNode *h1,*h2;
h1=lenA>=lenB?headA:headB;//长的链表
h2=lenA<lenB?headA:headB;//短的链表
while(len-->0)
h1=h1->next;
while(h1!=h2)
{
h1=h1->next;
h2=h2->next;
}
if(h1!=NULL)
return h1;
else
return NULL;
}
};