LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素

21. 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

在第一个ListNode这种类表示方法里,如果只有__init__这个定义函数,那这个类的实例化对象只能表示一个节点,它虽然具有初始节点值,也有.next这个定义,但没有接下来其他类函数去定义节点关系,那它就只能表示一个节点。

制作有序链表

有序链表1

head1 = ListNode(2)
n1 = ListNode(3)
n2 = ListNode(4)
n3 = ListNode(9)
head1.next = n1
n1.next = n2
n2.next = n3

有序链表2

head2 = ListNode(3)
m1 = ListNode(5)
m2 = ListNode(7)
m3 = ListNode(8)
head2.next = m1
m1.next = m2
m2.next = m3

输入有序列表,自动生成链表(官方方法)

def stringToListNode(input):
    # Generate list from the input
    numbers = json.loads(input)

    # Now convert that list into linked list
    dummyRoot = ListNode(0)
    ptr = dummyRoot
    for number in numbers:
        ptr.next = ListNode(number)
        ptr = ptr.next

    ptr = dummyRoot.next
    return ptr

主程序

#Definition for singly-linked list.
#class ListNode(object):
#    def __init__(self, x):
#        self.val = x
#        self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        
        head = ListNode(0)
        new_list = head
        
        # 测试程序会自动把l1,l2转换为链表
        while l1!=None and l2!=None:
            if l1.val <= l2.val:
                head.next = l1
                l1 = l1.next
            else:
                head.next = l2
                l2 = l2.next
            head = head.next
            
        if l1 != None:
            head.next = l1
        elif l2 != None:
            head.next = l2
        return new_list.next
        

LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1==None and l2==None:
            return None
        if l1==None:
            return l2
        if l2==None:
            return l1
        
        # 按顺序对比链表数值,返回较小值,并开始用较小值后面的值与原较大值比较
        if l1.val<=l2.val:
            l1.next=self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next=self.mergeTwoLists(l1,l2.next)
            return l2

LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素
递归逻辑思维图
LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素

26. 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        while i < len(nums) - 1:
            if nums[i] == nums[i+1]:
                nums.remove(nums[i])
            else:
                i = i + 1
        return len(nums)

LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        #设置两个指针,low记录非重复项,high依次遍历nums列表
        low = 0
        l = len(nums)
        
        #假如nums为空或者只有一个数字
        if l <= 1:
            return l
        else:
            #依次从nums列表读取元素
            for high in range(l):
                #当low和high对应的值不相等时,low向前进一位,
                #并且把high当前所对应的值赋给前进一位后的low,以保证nums从0开始按顺序排列
                if nums[low] < nums[high]:
                    low = low + 1
                    nums[low] = nums[high]
            #low的值+1就是新的长度
            #leetcode会自己打出nums长度范围内的值
            return low + 1

LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素

27. 移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不需要考虑数组中超出新长度后面的元素。

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        n_val=nums.count(val)
        n_nums=len(nums)
        while val in nums:
            nums.remove(val)
        return n_nums-n_val

LeetCode 合并两个有序链表 / 删除排序数组中的重复项 / 移除元素