首页 > 其他分享 >leetcode160-相交链表

leetcode160-相交链表

时间:2023-04-16 22:55:20浏览次数:50  
标签:ListNode 相交 next 链表 headB headA NULL leetcode160 节点

leetcode160

方法一:哈希表

思路:

  • 先创建一个unordered_set,存放ListNode*类型的变量
  • 先遍历其中一个链表,把所有节点的指针放在set中
  • 再遍历另一个链表,查找是否存在一个节点已经在set中,如果存在则说明这是它们的相交节点的指针,返回这个指针,如果不存在则说明不存在相交节点,返回NULL
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    unordered_set<ListNode*>hash;
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *A=headA,*B=headB;
        while(A!=NULL){
            hash.insert(A);
            A=A->next;
        }   
        while(B!=NULL){
            if(hash.find(B)!=hash.end())
                return B;
            else
                B=B->next;
        }
        return NULL;
    }
};

方法二:双指针

思路:

  • 让指针A和指针B分别指向headA和headB;A和B同时开始往后走,每次走一步,当A走到空时,就让A指向headB继续往后走;当B走到空时就让B指向headA继续往后走
  • 最终一定会出现A=B,这时有两种情况:①A和B都指向空,这说明两个链表没有相交节点;②A和B指向同一个非空节点,这个节点就是相交节点
    最终会出现A=B的原因:假设两个链表长度分别为a和b,A是先走完a,再走完b,走的长度是a+b;B是先走完b,再走完a,走的长度是b+a,二者走的路程一样,最终肯定会指向同一个节点。
/**
 * 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*A=headA,*B=headB;
        while(true){
            if(A==NULL && A!=B)
                A=headB;
            if(B==NULL && B!=A)
                B=headA; 
            if(A==B)
                return A;
            if(A==NULL && B==NULL)
                return NULL;
            A=A->next;
            B=B->next;
        }
        return NULL;
    }
};

标签:ListNode,相交,next,链表,headB,headA,NULL,leetcode160,节点
From: https://www.cnblogs.com/cxyupup/p/17324350.html

相关文章

  • 链表
    数据的创建,前插后插,遍历,计数,动态内存开辟动态创建等#include<stdio.h>#definededata8structTest{ intdata; structTest*next;};voidPrintlink(structTest*point){ //structTest*point; //point=head; intcount=0; while(point!=NULL) { print......
  • [牛客]链表中倒数第k个结点
    牛客链接使用快慢指针法:两种思路:1.fast先向后走k-1次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点时,slow刚好在倒数第k个位置上;2.fast先向后走k次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点的后面时(此时为NULL),slow刚好在倒数......
  • 算法-回文链表-24
    /***Definitionforsingly-linkedlist.*publicclassListNode{*publicintval;*publicListNodenext;*publicListNode(intx){val=x;}*}*/publicclassSolution{publicListNodeReverseList(ListNodehead){i......
  • 链表
    list链表:STL中的链表是双向循环链表迭代器不支持随机访问包括数据域和指针域构造:默认、区间、拷贝、n个elem赋值:重载=、区间,n个elem交换:swap();大小:resize();插入和删除:remove();insert();erase();数据存取:无法使用[]和at, 可以使用front();back();不支持随机访问的......
  • 环形链表_相交链表_多数元素(java语言)
    环形链表力扣141题问题:思路:创建hashset,把链表的每个节点放到集合中,在放入的过程中检查这个节点是否已经存在,存在则证明存在环。代码实现:publicclassSolution{publicbooleanhasCycle(ListNodehead){Set<ListNode>set=newHashSet<>();whi......
  • #yyds干货盘点# LeetCode程序员面试金典:K 个一组翻转链表
    题目:给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head=[1,......
  • 23-4-14--链表--银行排队问题之单队列多窗口服务
    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统......
  • EF 多个链表查询
      查询格式如下:varresult=(frompinPackagejoinqinPackageLocationPricesonp.Idequalsq.PackageIdintopqfromrinpq.DefaultIfEmpty()selectnew{p,r}).ToList(); ......
  • 链表
    概述链表是一种通过指针串联在一起的线性结构链表在内存中的存储形式链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上链表有节点组成,每个节点又分成两个部分:1)数据域(data)2)指针域数据域:存放数据指针域:存放指针,指向节点头节点(head)......
  • #yyds干货盘点# LeetCode程序员面试金典:两两交换链表中的节点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]代码实现:classSolution{publicListN......