LeetCode原题
21. 合并两个有序链表,链接: link
解题思路
- 思路1:递归,因系统隐式压栈,空间复杂度较高
- 思路2:迭代,双指针技巧,不需申请额外空间,改变链表指针指向即可
代码
Java
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
// 构造虚拟头节点
ListNode dummyHead = new ListNode(-1);
ListNode p = dummyHead;
ListNode p1 = list1;
ListNode p2 = list2;
while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
p.next = p1;
p1 = p1.next;
} else {
p.next = p2;
p2 = p2.next;
}
p = p.next;
}
p.next = p1 != null ? p1 : p2;
return dummyHead.next;
}
}
注意要点
- 细节
- 代码中构建了一个链表算法题中十分常见的虚拟头节点技巧,可以避免处理空指针的情况,降低代码的复杂性。
- 用到了双指针技巧,常见的可分为左右指针(从两端向中间相向而行,或从中心向两端扩展)和快慢指针。
- 延伸
- 数组中其实没有严格意义上的指针,但可以把数组中的索引当做是指针,这样也可以借鉴使用双指针技巧
推荐相关
- 19 删除链表的倒数第N个节点
- 141 环形链表
- 142 环形链表II
- 160 相交链表
- 92 反转链表II
- 234 回文链表
- 23 合并K个升序链表
- 27 移除元素
- 15 三数之和
- 42 接雨水
- 5 最长回文子串