码迷,mamicode.com
首页 > 其他好文 > 详细

【Linked List Cycle】cpp

时间:2015-05-01 00:25:22      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

题目

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

代码

用hashmap版

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
            std::map<ListNode *, bool> ifNodeOccured;
            ListNode *p = head;
            while ( p )
            {
                if ( ifNodeOccured.find(p) != ifNodeOccured.end() ) return true;
                ifNodeOccured.insert(std::pair<ListNode *, bool>(p,true));
                p = p->next;
            }
            return false;
    }
};

不用hashmap,改用双指针技巧版

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
            if (!head) return false;
            ListNode *p1 = head;
            ListNode *p2 = head;
            while ( p2->next && p2->next->next )
            {
                p2 = p2->next->next;
                p1 = p1->next;
                if (p2==p1) return true;
            }
            return false;
    }
};

Tips

这两种解法都是基本的技巧。第二种双指针的技巧效率更高,且空间复杂度更低,似乎得到了更多的推崇;但个人总觉得hashmap的方法不错,而且不强依赖于技巧。

【Linked List Cycle】cpp

标签:

原文地址:http://www.cnblogs.com/xbf9xbf/p/4470102.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!