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

Java中链表迭代添加节点的方法及合并有序链表代码异常排查

问题解答:链表迭代添加节点与合并链表的问题

让我们一步步解决你的两个问题:


1. Java中迭代向链表添加新节点的正确方式

要正确迭代构建链表,你需要维护两个关键指针:

  • 头指针:保存整个链表的起始位置,确保最后能返回完整链表
  • 尾指针:跟踪链表的最后一个节点,每次新节点都添加到它的后面,避免丢失之前创建的节点

举个简单的实现示例:

// 基于题目给出的ListNode类定义
public ListNode buildLinkedList(int[] values) {
    if (values == null || values.length == 0) {
        return null;
    }
    // 初始化头节点
    ListNode head = new ListNode(values[0]);
    // 尾指针初始指向头节点
    ListNode tail = head;
    
    for (int i = 1; i < values.length; i++) {
        ListNode newNode = new ListNode(values[i]);
        // 把新节点挂到尾节点的next上
        tail.next = newNode;
        // 更新尾指针到新节点
        tail = newNode;
    }
    return head;
}

核心逻辑是:永远不要在循环中重新赋值头指针,而是通过尾指针逐步扩展链表。


2. 你的合并链表代码的问题分析

你遇到的「打印仅输出最后一个值」的问题,根源在于每次循环都重置了mergedList的引用,导致之前创建的节点全部丢失:

看这段关键代码:

while(temp1 != null) {
    mergedList = new ListNode(temp1.val); // 每次循环都新建节点,覆盖之前的mergedList
    testpoint = mergedList; // testpoint也跟着指向这个新节点,旧链表完全丢失
    // ... 其他逻辑
}

每次进入while循环,mergedList都会被赋值为一个全新的ListNode,之前创建的节点没有被串联起来,最后自然只剩下最后一次创建的节点,打印时只能看到最后一个值。

除此之外,你的代码还有几个明显问题:

  • 拼写错误:打印时用了testPoint(大写P),但前面定义的变量是testpoint(小写p),这会导致编译错误
  • 嵌套循环逻辑混乱:内层while(temp2 != null)会一次性遍历完temp2,后续循环无法再处理剩余节点;curr = temp2的赋值逻辑也无法正确复位temp2的位置
  • 冗余的边界处理:else if(l1.next == null && l2.next == null)分支完全可以被通用逻辑覆盖,反而增加了代码复杂度

修复后的迭代合并思路

正确的迭代合并方法应该是这样的:

  1. 创建一个哑节点(dummy node),简化空链表的头节点处理
  2. 用current指针跟踪合并链表的尾节点
  3. 循环比较l1和l2的当前节点,把较小的节点挂到current后面,移动对应指针
  4. 其中一个链表遍历完后,直接把另一个链表的剩余部分挂到合并链表末尾

修复后的代码示例:

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 哑节点,避免处理空链表的头节点问题
        ListNode dummy = new ListNode(-1);
        ListNode current = dummy;
        
        // 循环比较两个链表的当前节点
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                current.next = l1;
                l1 = l1.next;
            } else {
                current.next = l2;
                l2 = l2.next;
            }
            // 移动current到新的尾节点
            current = current.next;
        }
        
        // 把剩下的非空链表直接挂到合并链表末尾
        current.next = (l1 != null) ? l1 : l2;
        
        // 返回合并后的链表头节点(哑节点的下一个)
        return dummy.next;
    }
}

之后你可以用这段代码打印完整的合并链表:

ListNode mergedResult = mergeTwoLists(l1, l2);
while (mergedResult != null) {
    System.out.println(mergedResult.val);
    mergedResult = mergedResult.next;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:59:08