写点什么

架构师训练营 2 期 - 第 8 周命题作业

用户头像
Geek_no_one
关注
发布于: 2020 年 12 月 12 日

有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。请用代码(或伪代码)描述算法,并给出时间复杂度。


判断两个链表是否相交:两个链表相交的话,那么他们最后的一个节点一定是相同的,可以分别遍历到两个链表的尾部,然后判断他们是否相同,如果相同,则相交;否则不相交。判断两个链表的交点:假设第一个链表长度为 m,第二个问 n,然后找出长度较长的,让长度较长的链表指针向后移动|m - n| ,然后在开始遍历两个链表,判断节点是否相同即可。


typedef struct node_t

{

int data;//data

struct node_t *next; //next

}node;


node find_node(node head1, node *head2)

{

if(NULL == head1 || NULL == head2)

{

return NULL;//如果有为空的链表,肯定是不相交的

}

node p1, p2;

p1 = head1;

p2 = head2;

int len1 = 0;

int len2 =0;

int diff = 0;

while(NULL != p1->next)

{

p1 = p1->next;

len1++;

}

while(NULL != p2->next)

{

p2 = p2->next;

len2++;

}

if(p1 != p2) //如果最后一个节点不相同,返回 NULL

{

return NULL;

}

diff = abs(len1 - len2);

if(len1 > len2)

{

p1 = head1;

p2 = head2;

}

else

{

p1 = head2;

p2 = head1;

}

for(int i=0; i<diff; i++)

{

p1 = p1->next;

}

while(p1 != p2)

{

p1 = p1->next;

p2 = p2->next;

}

return p1;

}


时间复杂度: O(N)

空间复杂度:O(N)


用户头像

Geek_no_one

关注

还未添加个人签名 2020.05.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 2 期 - 第 8 周命题作业