1. 程式人生 > 其它 >raf實現的vue輪播表(點選暫停、懸浮暫停等)

raf實現的vue輪播表(點選暫停、懸浮暫停等)

技術標籤:LeetCode連結串列

難度:簡單

輸入兩個連結串列,找出它們的第一個公共節點。

示例1:

在這裡插入圖片描述
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,連結串列 A 為 [4,1,8,4,5],連結串列 B 為 [5,0,1,8,4,5]。在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。

示例2:

在這裡插入圖片描述
輸入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Reference of the node with value = 2
輸入解釋:相交節點的值為 2 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,連結串列 A 為 [0,9,1,2,4],連結串列 B 為 [3,2,4]。在 A 中,相交節點前有 3 個節點;在 B 中,相交節點前有 1 個節點。

示例3:

在這裡插入圖片描述
輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2

輸出:null
輸入解釋:從各自的表頭開始算起,連結串列 A 為 [2,6,4],連結串列 B 為 [1,5]。由於這兩個連結串列不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
解釋:這兩個連結串列不相交,因此返回 null。

解題思路:
這道題就是利用一個特點,兩個連結串列的長度加起來是個固定值,如果遍歷完其中一個連結串列,那麼就遍歷另外一個連結串列,那麼相當於遍歷了一個長度相同的連結串列,成為合連結串列。如果兩個連結串列有相交的部分,那合連結串列的最後幾個節點必然是相同,如果沒有,最後會走到None。所以可以定義雙指標,對連結串列A、B分別遍歷,遍歷完如果找不到,讓A接著B,B接著A繼續遍歷。

python程式碼:

# 雙指標
class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        l1, l2 = headA, headB
        while l1 != l2:
            l1 = l1.next if l1 else headB
            l2 = l2.next if l2 else headA
        return l1

複雜度分析:

  • 時間複雜度 O ( N + M ) O(N+M) O(N+M) N N N M M M分別是兩個連結串列的長度,它們的和是需要遍歷的長度;
  • 空間複雜度 O ( 1 ) O(1) O(1):這裡除了定義了雙指標,沒有關於連結串列長度的變數,故是常數複雜度。