哈希表
链表
计数
题目描述
给定包含 k
个 不同 元素的链表的 head
节点,创建一个长度为 k
的链表,以 任何顺序 返回链表中所有 不同元素 出现的 频率 。返回这个链表的头节点。
示例 1:
输入:head = [1,1,2,1,2,3]
输出:[3,2,1]
解释:列表中有 3 个不同的元素。1 的频率是 3,2 的频率是 2,3 的频率是 1。因此,我们返回 3 -> 2 -> 1。
注意 1 -> 2 -> 3,1 -> 3 -> 2,2 -> 1 -> 3,2 -> 3 -> 1,和 3 -> 1 -> 2 都是合法的答案。
示例 2:
输入:head = [1,1,2,2,2]
输出:[2,3]
解释:列表中有 2 个不同的元素。1 和 2 出现的频率是 2 和 3。因此,我们返回 2 -> 3。
示例 3:
输入:head = [6,5,4,3,2,1]
输出:[1,1,1,1,1,1]
解释:列表中有 6 个不同的元素。每个元素的频率是 1。因此,我们返回 1 -> 1 -> 1 -> 1 -> 1 -> 1。
提示:
链表中的节点数字范围在 [1, 105 ]
之间。
1 <= Node.val <= 105
解法
方法一:哈希表
我们用一个哈希表 $cnt$ 记录链表中每个元素值出现的次数,然后再遍历哈希表的值构造新的链表即可。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为链表的长度。
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def frequenciesOfElements ( self , head : Optional [ ListNode ]) -> Optional [ ListNode ]:
cnt = Counter ()
while head :
cnt [ head . val ] += 1
head = head . next
dummy = ListNode ()
for val in cnt . values ():
dummy . next = ListNode ( val , dummy . next )
return dummy . next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode frequenciesOfElements ( ListNode head ) {
Map < Integer , Integer > cnt = new HashMap <> ();
for (; head != null ; head = head . next ) {
cnt . merge ( head . val , 1 , Integer :: sum );
}
ListNode dummy = new ListNode ();
for ( int val : cnt . values ()) {
dummy . next = new ListNode ( val , dummy . next );
}
return dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public :
ListNode * frequenciesOfElements ( ListNode * head ) {
unordered_map < int , int > cnt ;
for (; head ; head = head -> next ) {
cnt [ head -> val ] ++ ;
}
ListNode * dummy = new ListNode ();
for ( auto & [ _ , val ] : cnt ) {
dummy -> next = new ListNode ( val , dummy -> next );
}
return dummy -> next ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func frequenciesOfElements ( head * ListNode ) * ListNode {
cnt := map [ int ] int {}
for ; head != nil ; head = head . Next {
cnt [ head . Val ] ++
}
dummy := & ListNode {}
for _ , val := range cnt {
dummy . Next = & ListNode { val , dummy . Next }
}
return dummy . Next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function frequenciesOfElements ( head : ListNode | null ) : ListNode | null {
const cnt : Map < number , number > = new Map ();
for (; head ; head = head . next ) {
cnt . set ( head . val , ( cnt . get ( head . val ) || 0 ) + 1 );
}
const dummy = new ListNode ();
for ( const val of cnt . values ()) {
dummy . next = new ListNode ( val , dummy . next );
}
return dummy . next ;
}
GitHub