/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
*/
//法思路
//使用双指针法遍历两个链表,比较节点值大小,将较小的节点链接到新链表中。
//关键点:
//使用虚拟头节点简化边界处理
//双指针分别遍历两个链表
//时间复杂度 O(n),空间复杂度 O(1)
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
// 创建虚拟头节点
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
// 双指针遍历两个链表
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while (p1 != nullptr && p2 != nullptr) {
if (p1->val <= p2->val) {
cur->next = p1;
p1 = p1->next;
} else {
cur->next = p2;
p2 = p2->next;
}
cur = cur->next;
}
// 处理剩余节点
if (p1 != nullptr) {
cur->next = p1;
}
if (p2 != nullptr) {
cur->next = p2;
}
ListNode* result = dummy->next;
delete dummy; // 释放虚拟头节点
return result;
}
};