#include<iostream>
#include<vector>
#include<stack>
#include<math.h>
using namespace std;
typedef struct ListNode
{
int val;
ListNode * next;
}*List;
//判断是否有换,如果有环,则返回入环节点
List getLoopNode(List head)
{
List p = head->next;
List fast = p->next;
List slow = p;
while (slow != fast)
{
if (fast != NULL || fast->next != NULL)
return NULL;
fast = fast->next->next;
slow = slow->next;
}
fast = p;
while (fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
//如果两个单链表都没有环,先遍历链表求取链表长度,然后判断两个链边末尾指针地址是否
//一致,如果不一致一定不相交,如果一致,把长链表的长的部分去掉,和短链表一起遍历,
//相遇点就是相遇点
List getIntersection(List head1, List head2)
{
head1 = head1->next;
head2 = head2->next;
List cur1 = head1;
List cur2 = head2;
int len1 = 0;
int len2 = 0;
List end1 = cur1;
List end2 = cur2;
while (cur1 != NULL)
{
end1 = cur1;
len1++;
cur1 = cur1->next;
}
while (cur2 != NULL)
{
end2 = cur2;
len2++;
cur2 = cur2->next;
}
if (end1 != end2)
return NULL;
int dist = abs(len1 - len2);
cur1 = len1 > len2 ? head1 : head2;//cur1指向长链
cur2 = len1 > len2 ? head2 : head1;//短链
int count = 0;
while (count != dist)
{
count++;
cur1 = cur1->next;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;//相交点
}
//如果两个链表一个有环,一个无环,那么是不可能相交的
//两个都有环,那么要分情况讨论:
//1.两个链表不相交
//2.两个链表先相交,再有环
//3.两个链表在环山相交
List boothloop(List head1, List loop1, List head2, List loop2)
{
head1 = head1->next;
head2 = head2->next;
List cur1 = head1;
List cur2 = head2;
int len1 = 0;
int len2 = 0;
if (loop1 == loop2)//入环结点相同,则是先相交,在有环,相交部分不用考虑环
{
while (cur1!=NULL)
{
len1++;
cur1 = cur1->next;
}
while (cur1 != NULL)
{
len2++;
cur2 = cur2->next;
}
int dist = abs(len1 - len2);
cur1 = len1 > len2 ? head1 : head2;//长
cur2 = len1 > len2 ? head2 : head1;//短
int count = 0;
while (count != dist)
{
count++;
cur1 = cur1->next;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
else//入环结点不同
{
List cur = loop1->next;
while (loop1 != cur)
{
if (cur1 == loop2)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
}
判断两个单链表相交问题
最新推荐文章于 2022-05-09 12:25:50 发布