首页 > 其他分享 >BM7 链表中环的入口结点

BM7 链表中环的入口结点

时间:2023-02-01 20:11:59浏览次数:32  
标签:结点 slow ListNode nil fast 链表 pHead BM7 return

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=295&tqId=23449&ru=%2Fpractice%2Fff05d44dfdb04e1d83bdbdab320efbcb&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

方案一: 快慢指针

GO

package main
func EntryNodeOfLoop(pHead *ListNode) *ListNode{ if pHead == nil || pHead.Next == nil{ return nil } fast := pHead slow := pHead for fast != nil && fast.Next != nil{ fast = fast.Next.Next slow = slow.Next if fast == slow{ //slow从pHead开始走,fast一次一个node的访问 slow = pHead for fast != slow{ slow = slow.Next fast = fast.Next } return fast } } return nil
} 运行时间 6ms   占用内存 1916KB  

方案二: 用哈希存储

package main
func EntryNodeOfLoop(pHead *ListNode) *ListNode{ if pHead == nil || pHead.Next == nil{ return nil } isVisit := make(map[*ListNode]bool) pc := pHead for pc != nil{ if isVisit[pc]{ return pc } isVisit[pc] = true pc = pc.Next } return nil
} 运行时间 8ms   占用内存 2620KB  

C++


/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead == nullptr || pHead->next == nullptr){ return nullptr; } ListNode* fast = pHead; ListNode* slow = pHead;
while(fast != nullptr && fast->next != nullptr){ fast = fast->next->next; slow = slow->next; if(fast == slow){ slow = pHead; while(slow != fast){ slow = slow->next; fast = fast->next; } return fast; }   } return nullptr;
} }; 运行时间 6ms   占用内存 776KB  

标签:结点,slow,ListNode,nil,fast,链表,pHead,BM7,return
From: https://www.cnblogs.com/starter-songudi/p/17084030.html

相关文章

  • 递归先序输入构造一颗二叉树并输出并求从根结点出发的最大带权和 (c++)
    #include<iostream>#include<cstdio>usingnamespacestd;typedefstructBiTNode//一颗二叉树的结构体{intdata;structBiTNode*lchild,*rchiild;}BiTNode,......
  • 数据结构——链表
    链表数组要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于100MB,......
  • 判断是否为回文链表
    /***Definitionforsingly-linkedlist.*functionListNode(val,next){*this.val=(val===undefined?0:val)*this.next=(next===undefined......
  • 合并两个有序链表
    /***Definitionforsingly-linkedlist.*functionListNode(val,next){*this.val=(val===undefined?0:val)*this.next=(next===undefined......
  • 删除链表的倒数第N个节点
    /***Definitionforsingly-linkedlist.*functionListNode(val,next){*this.val=(val===undefined?0:val)*this.next=(next===undefined......
  • 代码随想录(2)-链表
    题单203.移除链表元素链表节点对象publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)......
  • BM2 链表内指定区间反转
    https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c?tpId=295&tqId=654&ru=%2Fpractice%2F1291064f4d5d4bdeaefbf0dd47d78541&qru=%2Fta%2Fformat-top10......
  • 剑指 Offer 06. 从尾到头打印链表
    题目:思路:【1】本质上,递归,辅助栈都是可以实现的方法,但是相比于递归,如果能用循环解决的话我更喜欢循环,因为递归也是需要消耗内存空间的,而且本质上其实只需要知道链表大小......
  • 双向链表
    双向链表单链表查找某结点的后继结点的执行时间为O(1);单链表查找某结点的后继结点的执行时间为O(n)在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链......
  • LeetCode 删除链表的倒数第 N 个结点(/)
    原题解题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。约束题解方法一classSolution{public:intgetLength(ListNode*head){......