相交链表(C语言实现)

题目描述

 

 

思路

两个链表在不相同的情况下计算出相差的节点个数,将长链表的指针走完差异的节点。之后两个指针一起走,当两个指针相同时则找到相交节点

解题方法

先计算两个链表的长度,写出长短链表,再计算二者的差异步,长链表的指针走完差异步,之后长短两个链表的指针一起走,两个指针相同时找到相交节点

 

 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
  struct ListNode *curA=headA;
  struct ListNode *curB=headB;
  int la=0;//记录A链表长度
  while(curA)
  {
    la++;
    curA=curA->next;
  }
  int lb=0;//记录B链表长度
  while(curB)
  {
    lb++;
    curB=curB->next;
  }
 struct ListNode * longList=headA;
 struct ListNode * shortList=headB;
 if(lb>la)//如果A小于B则交换
 {
   longList=headB;
   shortList=headA;
 }
 int p=abs(la-lb);//计算差异步
 while(p--)//长链表走完差异步
 {
   longList=longList->next;
 }
 
 while(longList)//长短链表一起走,相同时为相交节点
 {
  if(longList==shortList)
  {
    return longList;
  }
  
  longList=longList->next;
  shortList=shortList->next;
 }

 return NULL;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值