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)分支完全可以被通用逻辑覆盖,反而增加了代码复杂度
修复后的迭代合并思路
正确的迭代合并方法应该是这样的:
- 创建一个哑节点(dummy node),简化空链表的头节点处理
- 用
current指针跟踪合并链表的尾节点 - 循环比较l1和l2的当前节点,把较小的节点挂到current后面,移动对应指针
- 其中一个链表遍历完后,直接把另一个链表的剩余部分挂到合并链表末尾
修复后的代码示例:
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
相关产品推荐
相关产品推荐

