LeetCode 1669. 合并两个链表

题目描述

1669. 合并两个链表

image-20250416152213363

思路分析

解法一:定位断点 + 拼接(推荐)

核心思路

  • 找到 list1 中第 a-1 个节点与第 b 个节点。
  • list1[a, b] 区间整体替换为 list2
  • 连接方式为:preA.next = list2list2 的尾节点再连接 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. 排序链表 中等 链表
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/71454417
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!