状态:拿到本题的第一反应就是使用双指针,分别指向两个链表的开头位置。
随后的思路就是以第一条链表为基准完成插入,并且对于遍历到的每个节点都应该保存其状态。
写了一下代码后发现,我们应该以第一个节点较小的链表作为基准链表。
随后就是开始我们的遍历操作了。
cpp
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
// 其中一个链表为空,直接返回另一个链表
if (!list1) return list2;
if (!list2) return list1;
// 确定基准链表
ListNode* head = nullptr;
if (list1->val <= list2->val) {
head = list1;
list1 = list1->next;
} else {
head = list2;
list2 = list2->next;
}
// 当前操作指针指向基准链表的头节点
ListNode* current = head;
// 使用双指针来遍历两个链表
while(list1 && list2) {
if (list1->val <= list2->val) {
current->next = list1;
list1 = list1->next;
} else {
current->next = list2;
list2 = list2->next;
}
current = current->next;
}
// 最后链接剩余的链表
if (list1) {
current->next = list1;
} else {
current->next = list2;
}
return head;
}
};
当然了还有一种更加简单的思路,其实思路上主体都是一致的,不过代码上会简单很多,但是他会有一个额外的空间来申请一个新的链表。
cpp
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
// 创建一个虚拟头节点
ListNode dummy(0);
ListNode* current = &dummy;
// 使用双指针遍历两个链表
while (list1 != nullptr && list2 != nullptr) {
if (list1->val <= list2->val) {
current->next = list1;
list1 = list1->next;
} else {
current->next = list2;
list2 = list2->next;
}
current = current->next;
}
// 连接剩余的链表
if (list1 != nullptr) {
current->next = list1;
} else {
current->next = list2;
}
return dummy.next;
}
};