描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路1:
使用递归,递归的思路非常简单,先比较当前两个链表“首结点”的值,把有较小值的节点插入到新的链表,然后将除去这个结点的剩余链表和另一个链表进行递归,具体的代码如下:
class Solution {
public:
ListNode* Merge(ListNode* p1, ListNode* p2)
{
if(p1==NULL)
return p2;
else if(p2==NULL)
return p1;
ListNode* node=NULL;
if(p1->val > p2->val) {
node = p2;
node->next = Merge(p1, p2->next);
}
else {
node = p1;
node->next = Merge(p1->next, p2);
}
return node;
}
};
思路2:
插值法
思路也很简单,对于两个链表中的数,挨个比较大小,每次将较小的数插入新的链表,这里需要注意一下代码的鲁棒性,对于一些特殊的情况要单独处理一下。
class Solution {
public:
ListNode* Merge(ListNode* p1, ListNode* p2)
{
if(p1==NULL && p2==NULL) return NULL;
if (!p1)return p2;
if (!p2)return p1;
ListNode *p = new ListNode(0);
ListNode *head = p;
while(true) {
if(p1 == NULL) {
head->next = p2;
break;
}
if(p2 == NULL) {
head->next = p1;
break;
}
if(p1->val < p2->val) {
head->next = p1;
p1 = p1->next;
}
else {
head->next = p2;
p2 = p2->next;
}
head = head->next;
}
return p->next;
}
};