Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen.
Implement the Solution class:
・ Solution(ListNode head) Initializes the object with the integer array nums. ・ int getRandom() Chooses a node randomly from the list and returns its value. All the nodes of the list should be equally likely to be choosen.
Example 1:
Input ["Solution", "getRandom", "getRandom", "getRandom", "getRandom", "getRandom"] [[[1, 2, 3]], [], [], [], [], []] Output [null, 1, 3, 2, 2, 3] Explanation Solution solution = new Solution([1, 2, 3]); solution.getRandom(); // return 1 solution.getRandom(); // return 3 solution.getRandom(); // return 2 solution.getRandom(); // return 2 solution.getRandom(); // return 3 // getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.
Constraints:
・ The number of nodes in the linked list will be in the range [1, 10⁴]. ・ -10⁴ <= Node.val <= 10⁴ ・ At most 10⁴ calls will be made to getRandom.
Follow up:
・ What if the linked list is extremely large and its length is unknown to you? ・ Could you solve this efficiently without using extra space?
리스트에 있는 값 중 랜덤으로 하나를 선택하는 문제다.
리스트 중 하나를 랜덤으로 선택하는 건 비효율적이므로, 리스트를 탐색하면서 ArrayList에 따로 저장했다. 이후 Randam 클래스의 nextInt에 0~(리스트의 크기) 사이의 값을 index로 선택하여 ArrayList의 값을 리턴하면 된다.
/**
* 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 {
List<Integer> list = new ArrayList<>();
Random random = new Random();
public Solution(ListNode head) {
ListNode node = head;
while (node != null) {
list.add(node.val);
node = node.next;
}
}
public int getRandom() {
return list.get(random.nextInt(list.size()));
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(head);
* int param_1 = obj.getRandom();
*/