付付的100刷题计划5
删除链表中重复元素
删除重复元素,保留没有重复出现的数字
思路:
笨方法/双指针法
暴力求解法(笨方法)
题目要求是去重,用哈希表记录每个值出现的频率即可:
1 遍历链表,将每个节点的值放在哈希表中,哈希表的key就是节点的值,value就是这个值出现的频率
2 遍历哈希表,将所有频率==1的key放在集合中
3 对集合进行排序
4 遍历集合 然后不断创建新的链表节点
class Solution(object):
def deleteDuplicates(self, head):
# 用哈希表记录每个节点值的出现频率
d = dict()
p = head
arr = []
while p:
val = p.val
d[val] = d.setdefault(val,0)+1 #后面这个+1即把当键不存在时把默认值0加1为1,也就是统计出现的次数,从1开始
p = p.next
# 将所有只出现一次的值放到arr中,之后再对这个arr排序
for k in d:
if d[k]==1:
arr.append(k)
arr = sorted(arr)
dummy = ListNode(-1)#赋值,此时链表中的一个值为-1。随便赋什么值都可以。
p = dummy
# 创建长度为len(arr)长度的链表,依次将arr中的值赋给每个链表节点
for i in arr:
tmp = ListNode(i)
p.next = tmp
p = p.next
return dummy.next
方法知识点总结:
Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
key – 查找的键值。
default – 键不存在时,设置的默认键值。
sort()方法是针对列表类型的变量的一种排序方法,使用时:比如列表类型的变量ls, ls.sort()
sorted()方法是针对所有类型的变量,比sort()使用范围更广,使用时:sorted(ls),默认为升序排列。
双指针法
定义两个指针a,b
考虑到特殊情况,比如1->1->1->2这种,需要把开头的几个1去掉,因为增加一个哑结点:
a指针指向哑结点
b指针指向head,即哑结点的下一个节点
当两个指针指向的值相等时,b不断往前移动,这里是通过一个while循环判断的,因为要过滤掉1->2->2->2->3重复的2。
class Solution(object):
def deleteDuplicates(self, head):
dummy = ListNode(-1) #哑结点;随便赋一个值-1,什么值都可以
dummy.next = head
a = dummy
b = head
while b and b.next:#当b为假时即空时循环结束
# 初始化的时a指向的是哑结点,所以比较逻辑应该是a的下一个节点和b的下一个节点
if a.next.val!=b.next.val:
a = a.next
b = b.next
else:
# 如果a、b指向的节点值相等,就不断移动b,直到a、b指向的值不相等
while b and b.next and a.next.val==b.next.val:
b = b.next
a.next = b.next
b = b.next
return dummy.next