LeetCode刷题 -- 经典题目,相交链表

本文介绍了两种方法解决链表中两个链表的交点问题:暴力法通过逐个节点比较直到找到相等节点,时间复杂度较高;另一种方法是通过比较链表尾部地址和长度差异,实现高效查找。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

思路

法一 :暴力

  • A链表的节点跟B链表的所有节点比较,直到A链表中的某个节点和B链表中的某个节点相等这个节点就是交点
  • 就是A链表的第一个节点和B链表的所有节点比较,A链表节点再往后走,直到相等
  • 时间复杂度:O(NN)或O(NM)
    因为A链表M个节点,B链表N个节点,A链表节点走一步,B链表节点走N步
    所以A链表走M步,B链表走N*M步

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    ListNode* prev = headA;
    ListNode* pcur = headB;
again:    
    while(pcur != prev)
    {
       if(pcur == NULL)
       break;
       //pcur 等于空就遍历完一遍了
       pcur = pcur->next;
    }
    if(pcur == prev)
    return pcur;
    //遍历到 pcur 和 prev相等,就在同一个节点上 空或者非空
    pcur = headB;   
    //不相等,重新头开始
    prev = prev->next; 
    //prev走到下一个节点
    goto again;
    // 一遍一遍循环,直到 prev = pcur
}

思路

法二 :

  • 区分:相不相交找尾,如果尾的地址相同链表就相交,注意不是链表指向的值相同,如果链表不相交,而最后一个值也可以是相同的
  • 用假设法,判断A链表长,B链表短,否则,B链表长,A链表短,长的链表走差距步,然后长短链表同时走,
    两个指针就指向了第一个相交的节点了
    在这里插入图片描述
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
   //1.找尾,尾部的节点地址相同,链表就相交
   ListNode* curA = headA,*curB = headB;
   int lenA = 1,lenB = 1;
   while(curA->next)
   {
    curA = curA->next;
    ++lenA;
   }

   while(curB->next)
   {
    curB = curB->next;
    ++lenB;
   }
   if(curA != curB)
   {
    return NULL;
   }
   curA = headA;
   curB = headB;
    //2.让长的链表先走它们的差值个节点
  //假设法:假设A链表比B链表长
  int gap = lenA-lenB;
  ListNode* longList = curA;
  ListNode* shortList = curB;
  if(lenB>=lenA)
  {
    longList = curB;
    shortList = curA;
    gap = lenB - lenA;
  }
  //长的链表先走差距步大小
   while(gap--)
  {
    longList = longList->next;
  }
  //让长链表和短链表从同一起点开始走相同的步数大小
  while(longList != shortList)
  {
    shortList = shortList->next;
    longList = longList->next;
  }
  //指向长短链表的指针指向了起始节点(相同节点)
  return shortList;
}

结语

望博友们多多支持,祝福我们题题AC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值