题目描述
将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成的。
举例:
输入1: head1= 1->2->4 head2=1->3->4 输出1:head = 1->1->2->3->4
输入2: head1 = null, head2=null 输出:null
输入3: head=null, head2=0 输出: 0
解题方法: 算法本身没有难度,但是细节问题要处理好。
代码
#include <iostream>
#include <memory>
struct Node {
int value;
Node* next;
Node(int value) {
this->value = value;
this->next = nullptr;
}
};
void print(Node* head) {
if (head == nullptr) {
return;
}
Node* p = head;
while (p) {
std::cout << p->value << " ";
p = p->next;
}
std::cout << std::endl;
}
Node* merge(Node* head1, Node* head2){
//std::shared_ptr<Node> dummy_node = std::make_shared<Node>(-1);
std::shared_ptr<Node> dummy_node(new Node(-1));
Node* p = dummy_node.get();
Node* p1 = head1;
Node* p2 = head2;
while (p1 && p2) {
if (p1->value <= p2->value) {
p->next = p1;
p1 = p1->next;
} else {
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
if (p1) {
p->next = p1;
}
if (p2) {
p->next = p2;
}
return dummy_node->next;
}
int main()
{
Node node1(1);
Node node2(2);
Node node3(3);
Node node4(4);
Node node5(5);
Node node6(6);
Node node7(7);
Node node8(8);
// head1: 1->3->7->nulltpr
// 注意:最后一个元素的nullptr一定不能丢,否则会有segmentfault
// 本题通过在构造函数初始化next指针为空才避开这个问题
Node *head1 = &node1;
node1.next = &node3;
node3.next = &node7;
// head2: 2->4->5->6->8
Node *head2 = &node2;
node2.next = &node4;
node4.next = &node5;
node5.next = &node6;
node6.next = &node8;
// 合并前
std::cout << "before merge:" << std::endl;
print(head1);
print(head2);
// 合并后
std::cout << "after merge:" << std::endl;
Node * head = merge(head1, head2);
print(head);
return 0;
}
代码运行结果如下:
before merge:
1 3 7
2 4 5 6 8
after merge:
1 2 3 4 5 6 7 8