公司這套架構統一處理try...catch這麼香,求求你不要再滿屏寫了,再發現扣績效!
阿新 • • 發佈:2020-12-16
技術標籤:LeetCode--medium
給定一個連結串列,返回連結串列開始入環的第一個節點。如果連結串列無環,則返回null
。
為了表示給定連結串列中的環,我們使用整數pos
來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果pos
是-1
,則在該連結串列中沒有環。注意,pos
僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。
說明:不允許修改給定的連結串列。
進階:
- 你是否可以使用
O(1)
空間解決此題?
示例 1:
輸入:head = [3,2,0,-4], pos = 1 輸出:返回索引為 1 的連結串列節點 解釋:連結串列中有一個環,其尾部連線到第二個節點。
示例2:
輸入:head = [1,2], pos = 0 輸出:返回索引為 0 的連結串列節點 解釋:連結串列中有一個環,其尾部連線到第一個節點。
示例 3:
輸入:head = [1], pos = -1 輸出:返回 null 解釋:連結串列中沒有環。
提示:
- 連結串列中節點的數目範圍在範圍
[0, 104]
內 -105<= Node.val <= 105
pos
的值為-1
或者連結串列中的一個有效索引
思路:定義快慢兩個指標,相遇後(環中相匯點)將快指標指向 pHead 然後一起走,每次往後挪一位,相遇的節點即為所求。
詳細分析:相遇即 p1==p2 時,p2所經過節點數為 2x,p1 所經過節點數為 x,設環中有 n 個節點,p2 比 p1 多走一圈有2x=n+x;n=x;
程式碼實現:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle(ListNode head) { ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) { fast = head; while (fast != slow) { fast = fast.next; slow = slow.next; } return slow; } } return null; } }