问题描述:
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:利用栈后进先出的特性,将链表元素放入栈,然后从尾开始比较,会用O(n)的空间复杂度
思路2:先求出两个链表的长度lengthA、lengthB,然后长的链表先后移使之与短的长度相同,然后开始便利,找到相同的节点。
AC代码如下:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode * res = NULL;
int lengthA = 0;
int lengthB = 0;
ListNode *a,*b;
a = headA;
b = headB;
while(a != NULL)
{
lengthA++;
a = a->next;
}
while(b != NULL)
{
lengthB++;
b = b->next;
}
a = headA;
b = headB;
int diff = abs(lengthA - lengthB);
if(lengthA > lengthB)
{
for(int i = 0;i < diff;i++)
a = a->next;
}
if(lengthA < lengthB)
{
for(int i = 0;i < diff;i++)
b = b->next;
}
while(a!=NULL && b!= NULL)
{
if(a == b)
{
res = a;
break;
}
a = a->next;
b = b->next;
}
return res;
}