以下是Java实现合并两个有序链表的代码,添加了便于快速记忆的注释和口诀:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
// 创建虚拟头节点(哨兵节点)
ListNode dummy = new ListNode(-1);
ListNode tail = dummy; // 尾指针初始指向虚拟头
// 双指针遍历两个链表,选择较小值连接
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
tail.next = list1; // 连接较小节点
list1 = list1.next; // list1指针后移
} else {
tail.next = list2; // 连接较小节点
list2 = list2.next; // list2指针后移
}
tail = tail.next; // 尾指针始终指向最新节点
}
// 处理剩余节点(直接连接)
if (list1 != null) tail.next = list1;
if (list2 != null) tail.next = list2;
return dummy.next; // 返回虚拟头的下一个节点(真正的头节点)
}
// 辅助记忆口诀:
// 1. 虚拟头节点先创建
// 2. 双指针跟尾指针齐步走
// 3. 比大小后连小的
// 4. 指针后移别停留
// 5. 剩余节点直接接
// 6. 虚拟头后是答案
关键点记忆:
- 虚拟头节点:创建
dummy节点简化边界处理 - 双指针遍历:同时遍历两个链表,选择较小值节点连接
- 尾指针维护:
tail始终指向新链表的末尾节点 - 剩余节点处理:任一链表遍历完后,直接连接另一个链表剩余部分
时间复杂度:O(m+n)
空间复杂度:O(1)
这个算法的核心思想是通过比较两个链表当前节点的值,将较小值节点依次连接到新链表中,类似归并排序的合并过程。