leecode刷题第5天
1.今天的第一题是一道合并链表题,题目如下:
这道题的思路是先判断两个链表的头节点值谁大,如果l1大则将l1的头节点加入到curr中且l1=l1.next,否则将l2的头节点加入到curr中且l2=l2.next,直到l1和l2中有一个为空,最后将不为空的链表直接加入到curr中。代码如下:
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
curr=ListNode()#新建头节点
heads=curr
while l1!=None and l2!=None:
if(l1.val<l2.val):
curr.next=l1
l1=l1.next
else:
curr.next=l2
l2=l2.next
curr=curr.next
if l1!=None:
curr.next=l1
if l2!=None:
curr.next=l2
return heads.next
2.第二题题目如下:
这道题的一个最优解是:
首先检查数组是否为空数组
建立一个长度为26的数组,起始值为0
遍历所有字符串,将字母的出现频率放到数组的对应位置里(利用ascii码)
遍历数组,按照相同字母出现频率进行分组归类(使用hashmap)
遍历map,将结果返回
代码如下:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
if len(strs)==0:
return []
maps={}
for stri in strs:
characters=[0]*26
for i in range(len(stri)):
asciii=ord(stri[i])-97#得到对应字母的下标
characters[asciii]+=1
b=[str(i) for i in characters]
key="".join(b)
#将对应的键值保存到maps中,增加到对应的列表里方便输出结果
if (key in maps.keys()):
maps[key].append(stri)
else:
maps[key]=[stri]
result=[]
for i in maps.keys():
result.append(maps[i])
return result