Безопасно ли давать временный адрес (назначенный в блоке While) глобальному ListNode? - PullRequest
0 голосов
/ 29 мая 2018

Ссылка: https://leetcode.com/problems/add-two-numbers/solution/#

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
    int x = (p != null) ? p.val : 0;
    int y = (q != null) ? q.val : 0;
    int sum = carry + x + y;
    carry = sum / 10;
    curr.next = new ListNode(sum % 10);
    curr = curr.next;
    if (p != null) p = p.next;
    if (q != null) q = q.next;
}
if (carry > 0) {
    curr.next = new ListNode(carry);
}
return dummyHead.next;
}
}

Привет всем, сегодня утром я столкнулся с проблемой на LeetCode.Я решил это, но хочу поставить вопрос к официальному решению.

Я знаю, что ссылка на переменную, определенную в функции, небезопасна (потому что она будет переработана).Однако, насколько мне известно, те переменные, которые определены в блоках кода, таких как while / for , также должны быть переработаны JVM.Хотя JVM не будет перерабатывать его, поскольку все еще есть указатели, указывающие на адрес, мне интересно , если все еще небезопасно назначать временный адрес глобальному ListNode здесь ?

curr.next = new ListNode(carry);

ПослеИнтересно, должен ли JVM часто отслеживать ListNode для использования временного адреса, что приводит к дополнительному расходу времени?

Спасибо!Я также обсуждал вышеупомянутое в обсуждении проблемы в Leetcode, но я действительно хочу знать, рассматриваю ли я слишком много?

1 Ответ

0 голосов
/ 29 мая 2018

Я могу предположить, что вы использовали язык Java (как вы уже закодировали C). По поводу вашей проблемы я могу подвести итог

  1. Вы обеспокоены тем, что

    curr.next = новый ListNode (перенос);

    что curr может быть переработан java GC, что может вызвать исключение доступа при следующем повышении?=> Не беспокойся об этом.Курсор собирается только после выполнения addTwoNumbers () (как минимум).

  2. Так что ваш вопрос

    , если все еще небезопасно давать временный адресглобальный ListNode здесь?

    => Нет, это безопасно.Вы просто создаете новый объект, это нормально.

  3. Следующее беспокойство по поводу

    ListNode должен часто отслеживаться JVM для использования временного адреса,что приводит к дополнительному расходу времени?

    Как я вижу, в вашем назначении нет никакого дополнительного времени.

...