剑指 Offer 25. 合并两个排序的链表
本问题对应的 leetcode 原文链接:剑指 Offer 25. 合并两个排序的链表
问题描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
解题思路
视频讲解直达: 本题视频讲解
代码实现
时间复杂度:O(n+m),n 和 m 表示两个链表长度
空间复杂度:O(1)
评论(12)
1: 常规的解题思路,重点是看清是升序还是降序
2: 对于合并链表,需要两个节点同时遍历,每次动小的那个
3:加油1206
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode preNode = null;
ListNode headNode = null;
ListNode curNode = null;
while(l1 != null || l2 != null){
if(l1 null){
if(preNode null){
headNode = l2;
}else {
preNode.next = l2;
}
return headNode;
}
else if(l2 null){
if(preNode null){
headNode = l1;
}else {
preNode.next = l1;
}
return headNode;
}
else {
if (l1.val <= l2.val) {
curNode = l1;
l1 = l1.next;
} else {
curNode = l2;
l2 = l2.next;
}
if(preNode null){
headNode = curNode;
preNode = curNode;
}
preNode.next = curNode;
preNode = curNode;
}
}
return headNode;
}
}
时间复杂度o(1),o(n)
定义一个虚拟头结点,也就是 dummy 节点,它相当于是个占位符,可以避免处理空指针的情况,降低代码的复杂性。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 参考归并排序,时间复杂度为O(m+n)
ListNode *p1 = l1, *p2 = l2;
ListNode *ans = new ListNode();
};
时间复杂度O(n+m)
空间复杂度O(1)
时间复杂度 O(n+m) 分别是两条链表的长度,也可以理解为O(n)
空间复杂度 O(1)
C++ 题解
额