1. 程式人生 > 實用技巧 >公司這套架構統一處理try...catch這麼香,求求你不要再滿屏寫了,再發現扣績效!

公司這套架構統一處理try...catch這麼香,求求你不要再滿屏寫了,再發現扣績效!

技術標籤: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;

可以看出 p1 實際走了一個環的步數,再讓 p2 指向連結串列頭部,p1 位置不變,p1,p2 每次走一步直到 p1==p2; 此時 p1 指向環的入口。
程式碼實現:

/**
 * 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;
    }
}