Leetcode 023-合并K个升序链表,026-删除排序数组中的重复项,033-搜索旋转排序数组
023-合并K个升序链表
题目描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
代码(python)
class ListNode :
def __init__ ( self, x) :
self. val = x
self. next = None
class Solution :
def mergeKLists ( self, lists: List[ ListNode] ) - > ListNode:
length = len ( lists)
if length == 0 :
return None
if length == 1 :
return lists[ 0 ]
mid = length // 2
return self. merge( self. mergeKLists( lists[ : mid] ) , self. mergeKLists( lists[ mid: length] ) )
def merge ( self, node_a, node_b) :
dummy = ListNode( None )
cursor_a, cursor_b, cursor_res = node_a, node_b, dummy
while cursor_a and cursor_b:
if cursor_a. val <= cursor_b. val:
cursor_res. next = ListNode( cursor_a. val)
cursor_a = cursor_a. next
else :
cursor_res. next = ListNode( cursor_b. val)
cursor_b = cursor_b. next
cursor_res = cursor_res. next
if cursor_a:
cursor_res. next = cursor_a
if cursor_b:
cursor_res. next = cursor_b
return dummy. next
026-删除排序数组中的重复项
题目描述
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
代码(python)
class Solution :
def removeDuplicates ( self, nums: List[ int ] ) - > int :
a = 0
b = 1
while b < len ( nums) :
if nums[ a] == nums[ b] :
nums. pop( a)
else :
a += 1
b += 1
return len ( nums)
033-搜索旋转排序数组
题目描述
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
代码(python)
class Solution :
def search ( self, nums: List[ int ] , target: int ) - > int :
if not nums:
return - 1
l, r = 0 , len ( nums) - 1
while l <= r:
mid = ( l + r) // 2
if nums[ mid] == target:
return mid
if nums[ l] <= nums[ mid] :
if nums[ l] <= target < nums[ mid] :
r = mid - 1
else :
l = mid + 1
else :
if nums[ mid] < target <= nums[ len ( nums) - 1 ] :
l = mid + 1
else :
r = mid - 1
return - 1