合并两个链表
难度:
标签:
题目描述
给你两个链表 list1
和 list2
,它们包含的元素分别为 n
个和 m
个。
请你将 list1
中下标从 a
到 b
的全部节点都删除,并将list2
接在被删除节点的位置。
下图中蓝色边和节点展示了操作后的结果:

请你返回结果链表的头指针。
示例 1:
输入:list1 = [10,1,13,6,9,5], a = 3, b = 4, list2 = [1000000,1000001,1000002] 输出:[10,1,13,1000000,1000001,1000002,5] 解释:我们删除 list1 中下标为 3 和 4 的两个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。
示例 2:

输入:list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004] 输出:[0,1,1000000,1000001,1000002,1000003,1000004,6] 解释:上图中蓝色的边和节点为答案链表。
提示:
3 <= list1.length <= 104
1 <= a <= b < list1.length - 1
1 <= list2.length <= 104
代码结果
运行时间: 360 ms, 内存: 20.9 MB
/*
* Problem: Similar to the Java solution, but using Java Streams for practice.
*
* Note: Java Streams are generally used for collections, not linked lists.
* This solution is a conceptual use of Streams and may not be optimal for linked lists.
*/
import java.util.stream.*;
import java.util.*;
class ListNode {
int val;
ListNode next;
ListNode(int val) { this.val = val; }
}
public class StreamSolution {
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
List<ListNode> listNodes = new ArrayList<>();
// Convert list1 to a stream and collect nodes into a list
ListNode current = list1;
while (current != null) {
listNodes.add(current);
current = current.next;
}
// Find preA and postB using indexes a and b
ListNode preA = listNodes.get(a - 1);
ListNode postB = listNodes.get(b + 1);
// Connect preA to list2's head
preA.next = list2;
// Find the tail of list2
ListNode tail2 = list2;
while (tail2.next != null) {
tail2 = tail2.next;
}
// Connect the tail of list2 to postB
tail2.next = postB;
return list1;
}
}
解释
方法:
这个题解的思路是首先使用一个虚拟头结点(dummy node)指向list1的头部,以简化边界条件处理。接着,使用两个指针p1和p2来定位需要删除的链表部分的前驱和后继节点。p1指向位置a前的节点,而p2则指向位置b的下一个节点。然后,将list2的头部接到p1的后面,即p1.next = list2。之后,遍历到list2的尾部,将其与p2连接,完成链表的合并。这样不仅保持了list1中未删除部分的原有顺序,还将list2完整插入到了指定位置。
时间复杂度:
O(n + m)
空间复杂度:
O(1)
代码细节讲解
🦆
在题解中提到的虚拟头结点(dummy node)是如何简化边界条件处理的?
▷🦆
如果list1的长度n小于b,题解中的方法会如何处理?是否会出现错误或特殊情况?
▷🦆
题解中没有明确说明如何处理当a为0时的特殊情况,即当删除从头节点开始的部分。这种情况下算法的行为是怎样的?
▷🦆
在连接list2到list1的过程中,是否需要考虑list2为空的情况?如果list2为空,将会对链表结构产生什么影响?
▷