C语言:输入两条单链表,找出他们相交的节点。如果有,返回节点的位置,如果没有返回NULL

对于两条单链表,如果他们相交,则交点后的长度是相同的。
如图所示:
在这里插入图片描述
所以,我们需要做的是:
1.判断两条链表的长度
2.长链表和短链表相减,得到长链表和短链表对齐所需要的距离gap
3.让两个链表从同距离末尾同等距离的位置开始遍历
4.如果两个指针指向的位置相同,返回任意一个指针即可,反之返回空。

源代码:

SListNode *getIntersectionNode(SListNode *headA, SListNode *headB)
{
 int lenA = 0;
 int lenB = 0;
 int gap;
 int i;
 SListNode * cur;
 SListNode * longerlist = headA;
 SListNode * shorterlist = headB;
 for (cur = headA; cur; cur = cur->next)//求链表A的长度
 {
  lenA++;
 }
 for (cur = headB; cur; cur = cur->next)//求链表B的长度
 {
  lenB++;
 }
 gap = abs(lenA - lenB);//两条链表的长度差
 if (lenA < lenB)//默认链表A比链表B长,如果B比A长,则将长指针给B,短指针给A
 {
  longerlist = headB;
  shorterlist = headA;
 }
 for (i = 0; i < gap; i++)
 {
  longerlist = longerlist->next;
 }
 for (; longerlist && shorterlist; longerlist = longerlist->next, shorterlist = shorterlist->next)
 {
  if (longerlist == shorterlist)
  {
   return longerlist;
  }
 }
 return NULL;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值