classSolution:defmergeKLists(self, lists)-> ListNode:iflen(lists)==0:returnNone# print(len(lists))
i =1while i <len(lists):
lists[0]= self.mergeTwoLists(lists[0], lists[i])
i +=1return lists[0]defmergeTwoLists(self, l1: ListNode, l2: ListNode)-> ListNode:
i = ListNode()
i.next= l1
pi = i
j = ListNode()
j.next= l2
pj = j
while pi.next!=Noneand pj.next!=None:if pi.next.val <= pj.next.val:
pi = pi.nextelse:
mid = pj.next.next
pj.next.next= pi.next
pi.next= pj.next
pj.next= mid
pi = pi.nextif pj.next!=None:
pi.next= pj.nextreturn i.next
解法二
解法一会重复比较合并的元素, 使用分治可以有效降低重复度
即两两合并未合并的链表, 而不是用第一个链表合并其他所有链表
classSolution:defmergeKLists(self, lists)-> ListNode:iflen(lists)==0:returnNone
length =len(lists)while length >1:
i =1
j =0# print(3)while i < length:# print(1)
lists[j]= self.mergeTwoLists(lists[i -1], lists[i])# print(4)
i +=2
j +=1if length &1==1:
lists[j]= lists[i -1]
length = length //2if length %2==0else(length //2)+1# print(2)return lists[0]defmergeTwoLists(self, l1: ListNode, l2: ListNode)-> ListNode:
i = ListNode()
i.next= l1
pi = i
j = ListNode()
j.next= l2
pj = j
while pi.next!=Noneand pj.next!=None:if pi.next.val <= pj.next.val:
pi = pi.nextelse:
mid = pj.next.next
pj.next.next= pi.next
pi.next= pj.next
pj.next= mid
pi = pi.nextif pj.next!=None:
pi.next= pj.nextreturn i.next
LeetCode第26题: 删除排序数组中的重复项
使用双指针法, 即一个指针找出不重复元素, 另一个指针赋值元素, 且代表数组的真实长度
classSolution:defremoveDuplicates(self, nums: List[int])->int:
i =1
j =1
length =len(nums)while i < length:if nums[i]!= nums[i -1]:
nums[j]= nums[i]
j +=1
i +=1return j
LeetCode第33题: 搜索旋转排序数组
先对折, 如果target比第一个元素小, 就从后往前找, 否则从前往后找
classSolution:defsearch(self, nums: List[int], target:int)->int:
length =len(nums)if nums[0]> target:
i = length -1while nums[i]> target and nums[i]> nums[i -1]and i >0:
i -=1return i if nums[i]== target else-1if nums[0]< target:if nums[length -1]== target:return length -1
i =0while nums[i]< target and i < length -1and nums[i]< nums[i +1]:
i +=1return i if nums[i]== target else-1return0
LeetCode第23题: 合并K个升序链表解法一使用合并两个顺序链表的方法来合并k个链表class Solution: def mergeKLists(self, lists) -> ListNode: if len(lists) == 0: return None # print(len(lists)) i = 1 while i < len(lists): li