You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

while块创建的ListNode地址赋值给全局ListNode是否安全?是否影响性能?

关于LeetCode两数相加解法中JVM对象回收的疑问解答

嗨,我来帮你梳理清楚这个问题~

先贴出你提到的官方解法代码:

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; 
    } 
}

针对你的疑问,我逐一解答:

  • 临时ListNode的安全问题:完全不存在安全风险哦。你在while循环里创建的每个ListNode实例,都会被立刻赋值给curr.next,而curr是从dummyHead开始逐步向后移动的指针。最终函数返回的dummyHead.next是整个结果链表的头节点,只要这个返回的链表还被外部代码引用(比如LeetCode的判题逻辑持有它),整个链表上的所有节点都会被JVM判定为“可达”对象,绝对不会被垃圾回收器清理掉。

  • JVM监控带来的额外消耗:你确实有点过度担忧啦。JVM的垃圾回收机制对这类对象有非常成熟的优化策略——比如新生代的Eden区会优先存放短生命周期对象,就算这些对象最终存活下来进入老年代,GC的处理效率也很高。而且这些节点的创建和引用维护都是实现算法必须的操作,不会产生额外的、能被感知到的性能开销。官方解法这么写就是因为它既简洁又高效,完全不需要担心这方面的问题。

内容的提问来源于stack exchange,提问作者Qichao Ying

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:50:26