判断单链表是否交叉c语言,判断连个单链表是否交叉,并找到交叉点

链表如果相交则两个链表的形态应该是Y或者是V型,所以判断两个链表是否相交有两种方式:

一、比较两个链表的尾部是否相同,如果相同则两个链表相交,交叉点可以通过两个链表的长度差进行计算,因为交点后面的长度是相同的,差值是交点前形成的,可以分别设定两个指针,长的链表先遍历到差值的位置,短的链表指向头部,分别遍历直到相等就是交点的所在。

int IsCross(ListNode *p, ListNode *q){

if(p == NULL || q == NULL){

return 0;

}

ListNode *node1 = NULL;

ListNode *node2 = NULL;

while(p != NULL){

node1 = p;

p = p->next;

}

while(q != NULL){

node2 = q;

q = q->next;

}

if(node1 == node2){

return 1;

}else{

return 0;

}

}

寻找交点:

ListNode *FindNode(ListNode *p, ListNode *q){

if(p == NULL || q == NULL){

return NULL;

}

ListNode *node1 = p;

ListNode *node2 = q;

int len1 = 0, len2 = 0;

while(node1 != NULL){

node1 = node->next;

len1++;

}

while(node2 != NULL){

node2 = node2->next;

len2++;

}

int len = len1 > len2 ? len1 - len2 : len2 -len1;

ListNode *lenNode = len1 > len2 ? p : q;

ListNode *shortNode = len1 < len2 ? p : q;

for(int i = 0; i < len + 1;i++){

lenNode = lenNode->next;

}

while(shortNode != NULL && lenNode != NULL && shortNode != lenNode){

shortNode = shortNode->next;

lenNode = lenNode->next;

}

return shortNode;

}

二、如果两个链表相交,那么如果将一个链表的首尾相连,那么两个链表和在一起就会形成一个有环的链表,问题就归结到单链表是否有环的问题:

int IsCross(ListNode *p, ListNode *q){

if(p == NULL || q == NULL){

return 0;

}

ListNode *t = p;

while(t->next != NULL){

t = t->next;

}

t->next = p;

ListNode *fast = q;

ListNode *slow = q;

while(fast != NULL && fast->next != NULL){

fast = fast->next->next;

slow = slow->next;

if(fast == slow){

break;

}

}

if(fast != NULL && fast->next != NULL){

return 1;

}else{

return 0;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值