日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode--141. 环形链表

發布時間:2024/7/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode--141. 环形链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個鏈表,判斷鏈表中是否有環。

為了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。

?

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。


示例?2:

輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。


示例 3:

輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。

進階:

你能用 O(1)(即,常量)內存解決此問題嗎?

思路:快慢指針法

兩個指針從頭開始遍歷,快指針每次走兩步,慢指針每次走兩步

設慢指針走了n步,快指針就走了2n,每次的差距為n步,所以如果有環,快慢指針總會相遇

我們將慢指針的移動過程劃分為兩個階段:非環部分與環形部分:

1. 慢指針在走完非環部分階段后將進入環形部分:此時,快指針已經進入環中,非環部分長度=N

2. 兩個指針都在環形區域中:考慮兩個在環形賽道上的運動員 - 快跑者每次移動兩步而慢跑者每次只移動一步。其速度的差值為 1
??? ?因此,在最糟糕的情形下,時間復雜度為 O(N+K),也就是 O(n)。

剛開始還考慮過會不會快的每次兩步,如何跳過慢指針,后來仔細一想,發現不是這樣的,因為慢指針也在移動

通俗點可以理解為他們的相對速度只差一個格子,快的只能一個一個格子的去追慢的,必然在一個格子相遇。

如果沒看懂,看下面的詳細。
一次跳2個與一次跳一個格子的追上之后,是一定會在一個格子遇到的。因為在即將追上的時候,快的那個落后慢的1個或者2個格子,無論哪種,落后1個的話,下一步正好追上,落后2個格子的話,下一步就落后1個格子了,也可以說即將追上的時候一定是相差1個格子,下一步一定在一個格子相遇。

提交的代碼:

/**
?* Definition for singly-linked list.
?* class ListNode {
?* ? ? int val;
?* ? ? ListNode next;
?* ? ? ListNode(int x) {
?* ? ? ? ? val = x;
?* ? ? ? ? next = null;
?* ? ? }
?* }
?*/
public class Solution {
? ? public boolean hasCycle(ListNode head) {
? ? ? ? if(head==null||head.next==null)
? ? ? ? {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? ListNode slow,fast;
? ? ? ? slow = head;
? ? ? ? fast = head.next;
? ? ? ? while(slow!=fast)
? ? ? ? {
? ? ? ? ? ? if(fast.next==null||fast.next.next==null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? slow = slow.next;
? ? ? ? ? ? fast = fast.next.next;
? ? ? ? }
? ? ? ? return true;
? ? }
}

總結

以上是生活随笔為你收集整理的Leetcode--141. 环形链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。