算法基础~链表~求两个链表的交点( 时间复杂度O(n)、空间复杂度O(1))

简介: 算法基础~链表~求两个链表的交点( 时间复杂度O(n)、空间复杂度O(1))

  算法基础~链表~求两个链表的交点( 时间复杂度O(n)、空间复杂度O(1))


1,接着上一篇的优化思路:https://www.cnblogs.com/shan333/p/15033376.html

2,还记得上篇中说到:

【为什么要以其中一条链为参照链?  because:链表的长度不一,

 

例如图解(图在上一篇随笔中) A链表的长度明显就是长于B链表的,如果不以其中某一条链表为参照链,则A、B链表不可能相遇!】”~于是乎,咱的思路就呼吁而出啦!

3,设想一下链表A、B长度相同时,A、B同步移动,每移动一个结点便做一次比较地址,当比较的地址相同则找到了交点啦

~【这个过程并不需要额外申请其他空间~空间复杂度O(1);】 【A、B链表是同步移动,可以在同一循环里一起遍历~时间复杂度O(n)】

4,直接上代码,解释在2、3有:


public class Solution { 
  //获取链表的长度
  int get_list_length(ListNode *head){
      int len = 0;
      while(head){
          len++;
          head = head->next;
      }
      return len;
  }
  //对齐链表,将链表长度较长的链表移动到与另外一条链表对齐后返回
  ListNode *forward_long_list(int long_len, int short_len, ListNode *head){
      int delta = long_len - short_len;
      while(head && delta){
          head = head->next;
          delta--;
      }
      return head;
    }
    public :
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){}
    int list_A_len = get_list_length(headA);
    int list_B_len = get_list_length(headB);
    //A链表比较长时
    if(list_A_len > list_B_len){
        headA = forward_long_list(list_A_len, list_B_len, headA);
    }else{
        headB = forward_long_list(list_B_len, list_A_len, headB);
    }
    //同时遍历A、B链表,比较地址
    while(headA && headB){
        if(headA == headB){
            return headA;
        }
        headA = headA->next;
        headB = headB->next;
    }
    return NULL;
}



目录
相关文章
|
2月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
80 6
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
79 1
|
2月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
53 0
|
2月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
53 0
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
36 0
|
2月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
109 0
|
2月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
45 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

热门文章

最新文章