跳到主要内容

382. 链表随机节点 [medium]

382. 链表随机节点 [medium]

https://leetcode-cn.com/problems/linked-list-random-node/

给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。

进阶: 如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现?

示例:

// 初始化一个单链表 [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);

// getRandom()方法应随机返回1,2,3中的一个,保证每个元素被返回的概率相等。
solution.getRandom();

通过次数7,386 | 提交次数12,906

First Try

2020-09-21

跟0398一样属于蓄水池随机抽样算法,理解了思路后就很简单了。 对于每个新出现的数值,只要保证其概率为1/n,与前面被抹除掉的元素就能都拥有平等的概率。 实现这个概率筛选,只要用random.randint(0, count + 1),判断是否等于count + 1即可。


# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:

def __init__(self, head: ListNode):
"""
@param head The linked list's head.
Note that the head is guaranteed to be not null, so it contains at least one node.
"""
self.head = head


def getRandom(self) -> int:
"""
Returns a random node's value.
"""
val = float('-inf')
count = 0
node = self.head
while node:
if random.randint(1, count + 1) == count + 1:
val = node.val
count += 1
node = node.next
return val



# Your Solution object will be instantiated and called as such:
# obj = Solution(head)
# param_1 = obj.getRandom()
  • 执行用时:264 ms, 在所有 Python3 提交中击败了20.42%的用户
  • 内存消耗:16.5 MB, 在所有 Python3 提交中击败了89.12%的用户