搜索
简帛阁>技术文章>算法基础~链表~求两个链表的交点( 时间复杂度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; }

 

算法基础~链表~两个交点(时间复杂度O(n)、空间复杂度O(1)1,接着上一篇优化思路:https://wwwcnblogscom/shan333/p/15033376html2,还记得
算法基础~链表~两个交点(不考虑时间空间复杂度1交点结点~思路:找到同一个结点,指针指向同一个结点地址相同,(地址在内存分配上具有唯一特性可以使用工具set集合,因为唯一性+遍历
在LeetCode中看到判断回文程序:https://leetcodecom/problems/palindromelinkedlist/里面用单链表来存储数据,先反转前半部分单链表,然后分别从
本随笔来源于《剑指offer》第二版面试官:请实现一个排序算法,要求时间效率为O(n)。应聘者:对什么数字进行排序,有多少个数字?面试官:我们相对公司所有员工年龄排序。我们公司一共有几万名员工。应
问题:给你两个排序数组,两个数组交集。比如:A13457,B23589,那么交集就是35,n是a数组大小,m是b数组大小。思路:(1从b数组遍历取值,然后把值与a数组每一个值进行比较,如果
Java中Set和List集合contains()方法,检查数组链表中是否包含某元素检查数组链表中是否包含某元素,使用Set而不使用List原因是效率问题,前者setcontains()方法实现
自:http://blogcsdnnet/vast_sea/article/details/8167968看上去似乎任何已知算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,S
相信很多开发同伴们在研究算法、排序时候经常会碰到O(1),O(n),O(logn),O(nlogn)这些复杂度,看到这里就会有个疑惑,这个O(N)到底代表什么呢?首先o(1),o(n),o(log
morris遍历是二叉树遍历算法超强进阶算法,跟递归、非递归(栈实现空间复杂度,morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度O(N),而空间复杂度O(1)
mportjavautilScanner;/***迪杰斯特拉算法:单源点到其他点最短路径及距离*/publicclassPtest{//不能设置为IntegerMAX_VALUE,否则两个Inte