【leetcode】 數組和鏈表練習題目 26 189 88 21

26. 刪除排序數組中的重複項

class Solution:
    def removeDuplicates(self,nums:List[int])->int:
        # 雙指針
        i = 0
        for j in range(len(nums)):
            if nums[i] != nums[j]:
                i += 1
                nums[i] = nums[j]
        return i + 1

189. 旋轉數組

def rotate(nums, k: int) -> None:
    """
    Do not return anything, modify nums in-place instead.
    """
    n = len(nums)
    k = k % n
    nums[:] = nums[n-k:] + nums[:n-k]

這裏爲什麼是nums[ : ],爲什麼寫 nums 在IDE 裏面也OK ,但是 OJ 通不過,

  • nums1 = A # 更改 nums1 這一變量名所指向的對象。讓 nums1 變量指向 A 所指向的對象
  • nums1[:] = A # 對 nums1 指向的對象賦值。把 A 變量指向的對象的值逐個 copy 到 nums1 指向的對象中並覆蓋 nums1 指向的對象的原來值。
    參考

88.合併兩個有序數組

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        while n:  # 當 nums2 的裏面還有元素的時候,即 n 不爲 0
        #  當 nums1 的裏面還是有元素的時候,即 m 不爲 0  
            if m and nums1[m - 1] >= nums2[n - 1]:  
                nums1[m + n - 1] = nums1[m - 1]
                m -= 1
               # 此句是在 while 循環內的代碼,則 nums2 裏面是不爲 0 的,又和 前面 if 構成 if  else  的分支,所以 此處默認  m 不爲 0 ,就不用贅述了
            else:  
                nums1[m + n - 1] = nums2[n - 1]
                n -= 1

21 合併倆個有序鏈表
方法 1 :DummyNode

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        # DummyNode 
        dummy = cur = ListNode(0)
        while l1 and l2:   # l1 和 L2都存在的情況
            if l1.val < l2.val:
                cur.next = l1
                l1 = l1.next
            else:
                cur.next = l2
                l2 = l2.next 
            cur = cur.next 

        cur.next = l1 or l2   # l1 和 l2 不·爲 0的情況
        return dummy.next 
# recursively    
def mergeTwoLists2(self, l1, l2):
    if not l1 or not l2:
        return l1 or l2
    if l1.val < l2.val:
        l1.next = self.mergeTwoLists(l1.next, l2)
        return l1
    else:
        l2.next = self.mergeTwoLists(l1, l2.next)
        return l2
# in-place, iteratively        
def mergeTwoLists(self, l1, l2):
    if None in (l1, l2):
        return l1 or l2
    dummy = cur = ListNode(0)
    dummy.next = l1
    while l1 and l2:
        if l1.val < l2.val:
            l1 = l1.next
        else:
            nxt = cur.next
            cur.next = l2
            tmp = l2.next
            l2.next = nxt
            l2 = tmp
        cur = cur.next
    cur.next = l1 or l2
    return dummy.next
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章