算法通关村第一关—链表经典问题之合并两个链表笔记
源码地址:GitHub-算法通关村
题目地址:LeetCode
解题思路:
- 找到
list2
的尾结点。- 将
list2
的头节点赋值给list2End
。 - 使用循环遍历
list2
直到最后一个节点,同时更新list2End
的值。
- 将
- 寻找需要替换的区间
[a, b]
在list1
中的位置。- 初始化两个指针
p1
和p2
为list1
的头节点。 - 使用循环将
p1
移动到下标为a - 1
的位置,将p2
移动到下标为b + 1
的位置。
- 初始化两个指针
- 合并
list1
和list2
。- 将
list2
接在list1
的前一个节点p1
之后,即p1.next = list2
。 - 将
list2End
的后继节点接在list1
的后一个节点p2
之前,即list2End.next = p2
。
- 将
- 返回合并后的链表
list1
。
/**
* 合并两个链表
*
* @param list1
* @param a
* @param b
* @param list2
* @return
*/
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
// 1. 找到list2的尾结点
ListNode list2End = list2;
while (list2End.next != null) {
list2End = list2End.next;
}
// 2. 寻找[a,b]区间
ListNode p1 = list1;
ListNode p2 = list1;
// 2.1. 找到list1下标为a的前一个结点
for (int i = 0; i < a - 1; i++) {
p1 = p1.next;
}
// 2.2. 找到list1下标为b的后一个结点
for (int i = 0; i < b + 1; i++) {
p2 = p2.next;
}
// 3. 合并list1和list2
list2End.next = p2;
p1.next = list2;
return list1;
}