1. 程式人生 > >[leetcode]142. Linked List Cycle II

[leetcode]142. Linked List Cycle II

 第一種解法:hash表

//hash表形式,最高只能到第二梯隊
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
const static int x=[]{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    return NULL;
}();
//這裡有兩個坑,第一個是是否有迴圈,第二個是迴圈在哪裡
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(head == NULL) return NULL;
        map<ListNode*,int> m;
        ListNode *p=head;
        while(p){
            if(m.count(p)!=0){
                return p;
            }else{
                m[p]=1;
            }
            p=p->next;
        }
        return p;  
        
    }
};

第二種解法:

兩個指標p1,p2,p1每次移動一個節點,p2每次移動兩個節點,兩個指標相遇的時候表明有迴圈,否則沒有,要特別注意邊界。

尋找迴圈的開始節點是在判斷有迴圈後,p1指向head,然後p1和p2同時直移動一個節點,兩個指標碰面就是迴圈開始的位置了。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
const static int x=[]{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    return NULL;
}();
//這裡有兩個坑,第一個是是否有迴圈,第二個是迴圈在哪裡
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *p1,*p2;
        p1=p2=head;
        while(p2 && p2->next){
            p1=p1->next;
            p2=p2->next->next;
            if(p1 == p2) break;
        }
        if(p2==NULL || (p2->next==NULL)) return NULL;
        p1=head;
        while(p1!=p2){
            p1=p1->next;
            p2=p2->next;
        }
        return p1;
        
                
       
    }
};