剑指offer-合并两个排序的链表C++实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* head1, ListNode* head2) {
p = head1;
q = head2;
if (p == nullptr)return q;
if (q == nullptr)return p;
ListNode *merge_head = new ListNode(0);
head = merge_head;
while (p != nullptr && q != nullptr) {
if (p->val <= q->val) {
merge_head->next = p;
p = p->next;
} else {
merge_head->next = q;
q = q->next;
}
merge_head = merge_head->next;
}
if (p != nullptr) {
merge_head->next = p;
}
if (q != nullptr) {
merge_head->next = q;
}
return head->next;
}
private:
ListNode *p = nullptr;
ListNode *q = nullptr;
ListNode *head = nullptr;
};
思路:
利用双指针将单调非递减的链表合并到新链表中即可。首先判断一下p或q是否为空,为空则直接返回另一个非空链表,若两者都为空,返回一个空链表。接下来创建一个伪头结点,作为新链表的头部,然后判断q和p值的大小,将值小的结点存入新结点中即可。