首页 > 其他分享 >LeetCode160 相交链表

LeetCode160 相交链表

时间:2022-10-01 01:44:05浏览次数:78  
标签:ListNode 哈希 temp 相交 LeetCode160 链表 headB headA

 

 

 

idea:比较相同信息,首先想到用嵌套for循环解决,方法比较简单,不过时间复杂度高

 

/**  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNode(int x) : val(x), next(NULL) {}  * };  */ class Solution { public:     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {         ListNode* p=headA;         while(p!=NULL){             ListNode* q=headB;             while(q!=NULL){                 if(p==q)                     return p;                 else                     q=q->next;             }             p=p->next;         }           return NULL;     } };

 

 题解:

进阶:①哈希表法    idea:第一次接触哈希表,哈希表类似于一个将已有数据组转化为另一个具有下标的特殊数组,其中每个数据都可以在哈希表中找到“替身”,然后通过哈希表自带的函数操作,可以提高效率,降低时间复杂度

 

思路和算法

判断两个链表是否相交,可以使用哈希集合存储链表节点。

首先遍历链表 \textit{headA}headA,并将链表 \textit{headA}headA 中的每个节点加入哈希集合中。然后遍历链表 \textit{headB}headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:

如果当前节点不在哈希集合中,则继续遍历下一个节点;

如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 \textit{headB}headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。

如果链表 \textit{headB}headB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 null。

 

public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> visited = new HashSet<ListNode>();    //创建名为visited的哈希表
ListNode temp = headA;
while (temp != null) {      //一次循环将链表A中的每个结点存储到哈希表中
visited.add(temp);        //visited对象的方法,将对应数据上传到哈希表中
temp = temp.next;
}
temp = headB;
while (temp != null) {      //一次循环一一检验链表B中结点是否在哈希表中出现
if (visited.contains(temp)) {   //检验temp是否出现在已有哈希表中
return temp;
}
temp = temp.next;
}
return null;
}
}

 

复杂度分析

时间复杂度:O(m+n),其中 mm 和 nn 是分别是链表headA 和 headB 的长度。需要遍历两个链表各一次。

空间复杂度:O(m),其中 m 是链表 headA 的长度。需要使用哈希集合存储链表 headA 中的全部节点。

 

②双指针    idea:我感觉跟跟数学中的路径问题一联想不难理解,两个指针分别先后遍历AB和BA,如果不考虑相遇结点之后的相同部分,比如说从相遇开始到之前,A、B分别由2、3个结点,两个指针都走过5路径之后肯定会走到两个链表交会的结点上来。如果二者不相交,那么最后两个指针分别走到B和A的尾结点null,最终返回的也为null。

 

 

代码实现:

class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (headA == nullptr || headB == nullptr) {    //貌似可以删去这句话,也可以过
return nullptr;
}
ListNode *pA = headA, *pB = headB;
while (pA != pB) {
pA = pA == nullptr ? headB : pA->next;   //同时实现遍历和转接
pB = pB == nullptr ? headA : pB->next;
}
return pA;
}
};

 

复杂度分析

时间复杂度:O(m+n),其中 mm 和 nn 是分别是链表 headA 和headB 的长度。两个指针同时遍历两个链表,每个指针遍历两个链表各一次。

空间复杂度:O(1)。

 

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode-solutio-a8jn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:ListNode,哈希,temp,相交,LeetCode160,链表,headB,headA
From: https://www.cnblogs.com/Ting-LOVE/p/16746638.html

相关文章

  • LeetCode 206 反转链表
    给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出......
  • 【c语言编程基础】结构体单向链表的基本操作
    前言 关注点 code#include<stdio.h>#include<stdlib.h>#include<string.h>//strcat#defineSize4typedefstructTable{intlen;intsize;......
  • android面试题--单链表反转
     //定义链表类classNode{intdata;Nodenext;}voidmain(){//第一步:新建链表Nodefive=newNod......
  • 算法判断矩形和圆形相交 OBB & Circle
        转自:https://www.zhihu.com/question/24251545......
  • 反转链表
    题目:给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。  定义链表结构:  publicclassListNode{intval;ListNodenext;Lis......
  • leetcode链表1-6
    目录leetcode链表1.删除链表中的节点2.删除链表中倒数第n个节点3.反转链表4.合并两个有序链表5.判断回文链表6.判断是否为环形链表leetcode链表1.删除链表中的节点题目:......
  • 单链表注意事项
    经常采用的方法有头插法、尾插法、逆置法、归并法、双指针法等,对具体问题需要灵活变通;对于顺序表,由于可以直接存取,经常结合排序和查找的几种算法设计思路进行设计,如归并排......
  • 循环链表(约瑟夫环)思路及实现
    循环链表单链表的尾节点指向首节点,即可构成循环链表约瑟夫环约瑟夫问题:有N个人围成一圈,每个人都有一个编号,编号由入圈的顺序决定,第一个入圈的人编号为1,最后一个为N......
  • golang 的双向循环链表
                如下为go实现的双向循环列表。packagemainimport("fmt")typeRingstruct{prev,......
  • [数组和链表的区别]
    [数组和链表的区别]数组'''数组插入数据因为需要连在一起,如果内存空间不连续就得全体迁移,甚至出现内存空间足够但是由于不在一起而导致无法为数组分配内存。'''链......