生活随笔
收集整理的這篇文章主要介紹了
LeetCode 142 环形链表 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。為了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開
始)。 如果 pos 是 -1,則在該鏈表中沒有環。注意,pos 僅僅是用于標識環的情況,并不會作
為參數傳遞到函數中。
題解
1)可以用map存儲指針,如果其已經出現過,則為入環第一個節點。
2)關于判斷鏈表是否有環,使用快慢指針即可,看其是否會相遇
關于找到環的入口,假設鏈表頭部至環入口的長度為a,入口至相遇點的長度為x,環的大小
為b,則慢指針走的步數為a+x(前面已經說明過為什么在第一次進入環內就相遇),快指針
走的步數為a+x+kb,其之間的關系為2(a+x)=a+x+kb,變換一下可得a=(k-1)b+b-x,也就是
說,鏈表頭部至環入口的長度=環長度的整數倍+相遇處與入口之間的距離,我們在此時讓一
個指針從鏈表頭部和慢指針一起進行移動,當它們倆相遇時就是我們要找的入口處。假設
k=2,那么新指針走了a步之后到達環入口處,慢指針走了a=b+b-x步也到達環的入口處,其實
就等同于慢指針繞環k-1圈以及b-x步剛好也走到環的入口處。
代碼
141. 環形鏈表/*** 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) {ListNode* l=head,*f=head;while (f&&f->next){l=l->next;f=f->next->next;if (l==f) return true;}return false;}
};
142. 環形鏈表 II/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* l=head,*f=head,*p=head;while (f&&f->next){l=l->next;f=f->next->next;if (l==f){while (l!=p){p=p->next;l=l->next;}return p;}}return NULL;}
};
總結
以上是生活随笔為你收集整理的LeetCode 142 环形链表 II的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。