- 力扣:第 21 题链接
- 本文实现代码:C++
- 链表结点的结构体定义
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
1 一般合并方法 - 新建一个链表存储排序结果
记得严蔚敏的数据结构那本书里就是一个合并算法。
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
ListNode *head = nullptr;
ListNode *current = nullptr;
while (list1 != nullptr && list2 != nullptr) {
ListNode *newNode;
if (list1->val < list2->val) {
newNode = new ListNode(list1->val);
list1 = list1->next;
} else {
newNode = new ListNode(list2->val);
list2 = list2->next;
}
if (head == nullptr) {
current = newNode;
head = current;
} else {
current->next = newNode;
current = current->next;
}
}
if (list1 != nullptr) {
current->next = list1;
}
if (list2 != nullptr) {
current->next = list2;
}
return head;
}
2 一般合并方法 - 不新建一个链表存储排序结果
新建一个链表存储排序结果需要浪费很大的空间。
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
ListNode* current = nullptr;
ListNode* head = nullptr;
while (list1 != nullptr && list2 != nullptr) {
if (list1->val < list2->val) {
if (current == nullptr) {
current = list1;
} else {
current->next = list1;
current = current->next;
}
list1 = list1->next;
} else {
if (current == nullptr) {
current = list2;
} else {
current->next = list2;
current = current->next;
}
list2 = list2->next;
}
if (head == nullptr) {
head = current;
}
}
if (list1 == nullptr) {
current->next = list2;
}
if (list2 == nullptr) {
current->next = list1;
}
return head;
}
代码还是很臃肿
3 递归算法
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
if (list1->val < list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
} else {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}
}
递归算法在性能上不如合并算法(不如上面的第1个和第2个算法),理解起来也不如合并算法好理解。