链表求环

作者: 徐凯_xp | 来源:发表于2018-03-07 09:45 被阅读0次

LeetCode 141. Linked List Cycle 142.Linked List Cycle II

已知链表中可能存在环,若有环返回环起始节点,否则返回NULL。


算法1:使用set求环起始节点

1.遍历链表,将链表中节点对应的指针(地址),插入set
2.在遍历时插入节点前,需要在set中查找,第一个在set中发现的节点地址,即是链表环的起点。


class Solution{
public:
    ListNode * detectCycle(ListNode *head){
    std:: set<ListNode *> node_set;//设置node_set
    while(head){
    if(node_set.find(head) != node_set.end()){
    return head;
}
node_set.insert(head);//将节点插入node_set
head = head->next;
}
return NULL;//没有遇到环,则返回NULL
}
}
算法2:快慢指针赛跑




结论:从head和meet出发,两指针速度一样,相遇时即为环的起点
class Solution{
public:
    ListNode * detectCycle(ListNode *head){
    ListNode *fast = head;//快慢指针
    ListNode *slow = head;
    ListNode *meet = NULL;
    while(fast){
    slow = slow->next;
    fast = fast->next;
    if(!fast){
        return NULL;//如果遇到链表尾,返回NULL
    }
fast = fast->next;
   if(fast ==  slow){
      meet = fast;  
      break;
  }
}
if(meet == NULL){
  return NULL;  
}
while(head && meet){
    if(head == meet){
        return head;    
}
head = head->next;
meet = meet->next;
}
return NULL;
}

};
测试与Leetcode提交结果
int main(){
  ListNode a(1);
  ListNode b(2);
  ListNode c(3);
  ListNode d(4);
  ListNode e(5);
  ListNode f(6);
  ListNode g(7);
  a.next = &b;
  b.next = &c;
  c.next = &d;
  d.next = &e;
  e.next = &f;
  f.next = &g;
  g.next =&c;
  Solution solve;
  ListNode *node = solve.detectCycle(&a);
  if(node){
    printf("%d\n",node->val);
  else{
      printf("NULL\n");
  }  
return 0;
}

}

相关文章

  • 算法题面试复习

    算法模块 1. 链表 1. 链表翻转 2. 单链表判断是不是环+求环位置+求环长度 以图片为例,假设环入口距离链表...

  • 链表求环

    LeetCode 141. Linked List Cycle 142.Linked List Cycle II ...

  • 3. 链表求环

    已知链表中可能存在环,若有环返回环起始节点,否则返回NULL。 方法一:使用set求环起始节点 遍历链表,将链表中...

  • 寻找两个链表的第一个公共结点

    有三种情况: 1、 两个链表都没有环2、 一个链表有环,一个链表无环3、 两个链表都有环 参考文章:求两个单链表的...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • 算法应用-单链表

    单向链表中代码实现检查是否有环,如果有环,求环的长度和入环的节点? 思路: 假设单链表如上图,检查是否有环这个简单...

  • P111-判断一个单向链表是否构成了环形,找出环的出口

    判断是否为环 思路1 两个指针 思路2 map 求入口 参考:链表有环,判断环的入口点 求环长 参考:那么如何得到...

  • 判断单链表是否有环、求环长和环入口最优算法

    判断单链表是否有环、求环长和环入口最优算法 判断单链表是否有环是一个十分经典的算法问题,许多考试或者面试都有很大的...

  • 找链表的环入口问题

    题目:已知一个链表有环,求环的入口 链表有环,所以让一个快指针,一个慢指针,同时从起点出发,他们必定在环中相遇。而...

  • 有环链表的判断以及入口点计算

    题意:给定一个单向链表,求判断该链表是否为带环链表并求出该环的入口点 来源地址:Chasiny 例如下图,一个带环...

网友评论

    本文标题:链表求环

    本文链接:https://www.haomeiwen.com/subject/feylfftx.html