[leetcode]142. Linked List Cycle II
阿新 • • 發佈:2018-11-19
第一種解法: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; } };