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.
写一个程序找出两条链表的交叉点。
Notes:如果两个链表没有交叉点就返回null
链表必须在函数返回后维持其原有的结构
链表中没有环形链表结构
代码的时间复杂度最好为O(n),空间复杂度最好为O(1)
先计算出两条链表的长度,计算的同时判断最后一个值是否相同,不同则返回null。然后从长的链表跟短的链表长度一致的位置开始比较,当找出相同的值直接返回。代码如下:
/**
* 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) {
ListNode *beginA=headA,*beginB=headB;
int m=1,n=1;
if(beginA==NULL || beginB==NULL) return NULL;
while(beginA->next!=NULL)
{
beginA=beginA->next;
n++;
}
while(beginB->next!=NULL)
{
beginB=beginB->next;
m++;
}
if(beginA!=beginB) return NULL;
beginA=headA;
beginB=headB;
if(n>m)
{
for(int i=0;i<n-m;i++)
{
beginA=beginA->next;
}
while(beginA!=beginB)
{
beginA=beginA->next;
beginB=beginB->next;
}
return beginA;
}
else
{
for(int i=0;i<m-n;i++)
{
beginB=beginB->next;
}
while(beginA!=beginB)
{
beginA=beginA->next;
beginB=beginB->next;
}
return beginA;
}
return NULL;
}
};