算法题(三)
2021/12/9 1:17:00
本文主要是介绍算法题(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、合并两个有序链表
解题思路:两个链表都是升序链表,要将其串成一个升序链表,则需要新建一个链表,每次都指向节点的最小值,要考虑链表越界的情况。时间复杂度O(m+n),空间复杂度O(1)。
代码:
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def mergeTwoLists(self, list1, list2): """ :type list1: Optional[ListNode] :type list2: Optional[ListNode] :rtype: Optional[ListNode] """ flage1 = list1;flage2= list2 newlist = ListNode() satrt = newlist while flage1 != None or flage2 != None: if flage1 == None: newlist.next = flage2 break if flage2 == None : newlist.next = flage1 break if flage1.val <= flage2.val: newlist.next = flage1 flage1 = flage1.next else: newlist.next = flage2 flage2 = flage2.next newlist = newlist.next return satrt.next
注意:此题可用递归法,也可以用循环法。
2、删除有序数组中的重复项
解题思路:这道题比较简单,但是letcode上很多解法是不符合题意的。题中明确提到,需要原地删除旧数组中的元素!如果不删除这道题就很简单,遍历一遍就可以找到结果,但是如果原地删除旧数组中的元素,将会导致索引变化。因此可以采用双指针的方式来记录删除前后的位置信息。时间复杂度O(n),空间复杂度O(1)。
class Solution(object): def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) <2: return len(nums) l = 0 f = 1 while l!=f: if f> len(nums)-1: break if nums[f] == nums[l]: del nums[f] else: l+=1 f+=1 return len(nums)
3、移除元素
解题思路:与上一题类似,只需要用一个指针记录位置就可以,符合条件就删除,不符合条件指针就+1。
class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ p = 0 while p < len(nums): if nums[p] ==val: del nums[p] else: p += 1 return len(nums)
这篇关于算法题(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API