LeetCode 1669. 合并两个链表
题目描述
思路分析
解法一:定位断点 + 拼接(推荐)
核心思路:
- 找到
list1中第a-1个节点与第b个节点。- 将
list1的[a, b]区间整体替换为list2。- 连接方式为:
preA.next = list2,list2的尾节点再连接postB。
复杂度分析:
- 时间复杂度:O(n + m),其中 n、m 分别表示两条链表长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
ListNode dummy = new ListNode(0);
dummy.next = list1;
// prev 指向第 a 个节点的前一个位置
ListNode prev = dummy;
for (int i = 0; i < a; i++) {
prev = prev.next;
}
// cur 指向第 b 个节点
ListNode cur = prev;
for (int i = a; i <= b; i++) {
cur = cur.next;
}
ListNode post = cur.next;
prev.next = list2;
// 找到 list2 的尾节点
ListNode tail = list2;
while (tail.next != null) {
tail = tail.next;
}
tail.next = post;
return dummy.next;
}
}
func mergeInBetween(list1 *ListNode, a int, b int, list2 *ListNode) *ListNode {
dummy := &ListNode{Next: list1}
// prev 指向第 a 个节点的前一个位置
prev := dummy
for i := 0; i < a; i++ {
prev = prev.Next
}
// cur 指向第 b 个节点
cur := prev
for i := a; i <= b; i++ {
cur = cur.Next
}
post := cur.Next
prev.Next = list2
// 找到 list2 的尾节点
tail := list2
for tail.Next != nil {
tail = tail.Next
}
tail.Next = post
return dummy.Next
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 21. 合并两个有序链表 | 简单 | 链表 |
| 86. 分隔链表 | 中等 | 链表 |
| 92. 反转链表 II | 中等 | 链表 |
| 24. 两两交换链表中的节点 | 中等 | 链表 |
| 148. 排序链表 | 中等 | 链表 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
