• LeetCode Intersection of Two Linked Lists (找交叉点)


    题意:

      给两个链表,他们的后部分可能有公共点。请返回第一个公共节点的地址?若不重叠就返回null。

    思路:

      用时间O(n)和空间O(1)的做法。此题数据弱有些弱。

      方法(1)假设两个链表A和B,用两个指针分别按顺序遍历AB和BA,这AB和BA肯定等长的。如果他们有公共点,那么按照这样走必定会在某个点相遇。所以只要预先判断是否有公共点,这只需要用两个指针分别指向A和B的链尾判断是否相同即可(这一步可以使用更简单的方法,增加1个计数器,判断指针1是否已经遍历过AB了)。

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    12         ListNode *L1=headA;
    13         ListNode *L2=headB;
    14         //若无交点,且AB等长,那么他们会在null处相遇,退出。
    15         //先判断是否有交点先。
    16         while(L1&&L1->next) L1=L1->next;
    17         while(L2&&L2->next) L2=L2->next;
    18         if(L1!=L2)  return NULL;
    19         L1=headA;
    20         L2=headB;
    21         while(L1!=L2)
    22         {
    23             if(L1)  L1=L1->next;
    24             else    L1=headB;
    25 
    26             if(L2)  L2=L2->next;
    27             else L2=headA;
    28         }
    29         return L1;
    30     }
    31 };
    AC代码

       方法(2)先统计链A和B的长度,假设A长,那么指针1先走|A|-|B|步,然后再同时走,若有公共点必定会相遇。

  • 相关阅读:
    类加载器加载class文件
    多线程用到的概念知识点
    3年工作经验你的程序员应该具备的技能
    面试题
    正则表达式(一)
    Servlet(五)----ServletContext对象
    Servlet(四)----HTTP、Response、servletContent
    JDBC(三)----Spring JDBC(JDBCTemplate)
    JDBC(四)----数据库连接池
    JDBC(三)----JDBC控制事务
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4639416.html
Copyright © 2020-2023  润新知