题目描述
我的想法
时间复杂度: O(N*N)
空间复杂度:O(1)
拿到题目没有什么简单的方法,我想的是:每遍历A中的一个节点,就遍历B中的全部节点一次,找出相同的地址。这个思路很复杂,幸好是两个链表相交,如果有x个链表相交,就更复杂,时间复杂度就是N个x相乘。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
ListNode*l1=headA;
ListNode*l2=headB;
//遍历A链表
while(l1)
{
l2=headB;
//遍历B链表
while(l2)
{
if(l2->val==l1->val)
{
if(l1==l2)
return l1;
}
l2=l2->next;
}
l1=l1->next;
}
return NULL;
}
简单思路
时间复杂度O(N),空间复杂度O(1)
1.先分别数一下两链表的个数
2.顺便初步判断一下为节点的地址是否相同,相同的话就说明有相交节点,否则没有
3.让长的链表先走 差距步
4.再两链表同时走,如果发现相同的地址就返回
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//时间复杂度O(N),空间复杂度O(1)
//1.先分别数一下两链表的个数
int count1=1,count2=1;
ListNode*L1=headA,*L2=headB;
while(L1->next)
{
count1++;
L1=L1->next;
}
while(L2->next)
{
count2++;
L2=L2->next;
}
//2.顺便初步判断一下为节点的地址是否相同,相同的话就说明有相交节点,否则没有
if(L1!=L2)
return NULL;
//3.让长的链表先走 差距步
L1=headA;
L2=headB;
int gap=abs(count1-count2);
if(count1>count2)//A长
{
while(gap--)
{
L1=L1->next;
}
}
else//B长
{
while(gap--)
{
L2=L2->next;
}
}
//4.再两链表同时走,如果发现相同的地址就返回
while(1)
{
if(L1==L2)
return L1;
L1=L1->next;
L2=L2->next;
}
}