【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

你可能感兴趣的:(算法和数据结构刷题,链表,leetcode,指针,数据结构)