架构师训练营 2 期 - 第 8 周命题作业
有两个单向链表(链表长度分别为 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)
评论