题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
非递归:
定义链表指针p1,p2
首先 做个判断 将链表头的值较小的赋给p1 , 另外一个则赋给p2
然后两个链表的数值作比较 将p2链表的元素依次插入p1链表中
// 其中有几个小细节需要注意 : 看代码注释
递归:
递归的方法就很容易让人懂了
首先定义一个链表指针 pMergeHead
然后比较两个链表的头结点大小 将较小的赋给pMergeHead
最后 pMergeHead -> next= 函数名(小的节点->next,大的节点)
代码:
非递归版本:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { //非递归写法
if (pHead2 == NULL || pHead1 == NULL) {
return pHead1 ? pHead1 : pHead2;
}
ListNode* p1 = pHead1->val <= pHead2->val ? pHead1 : pHead2;
ListNode* p2 = pHead1->val > pHead2->val ? pHead1 : pHead2;
ListNode* pMergeHead = NULL; buf = pHead1->val <= pHead2->val ? pHead1 : pHead2; //合并链表的头指针
ListNode* spe = NULL; //记录p1指针的位置
while (p1 && p2) { //当有一个指针指向空时 则循环退出
if (p1->next != NULL && p1->next->val >= p2->val) {
ListNode* tmp = p1->next;
ListNode* tmp1 = p2->next;
p1->next = p2;
p2->next = tmp;
p1 = p1->next;
p2 = tmp1;
}
else {
spe = p1; //每次记录p1指针的位置 防止指向空 影响下一步操作
p1 = p1->next;
}
}
if (p1 == NULL) { //当p1指向空时 那么spe则是p1上一步的指针 将该指针指向p2即可连接起整个链表
spe->next = p2;
}
return pMergeHead;
}
递归:
ListNode* Merge1(ListNode* pHead1, ListNode* pHead2) { //递归写法
if (!pHead1) {
return pHead2;
}
else if (!pHead2) {
return pHead1;
}
ListNode* pMergeHead = nullptr;
if (pHead1->val <= pHead2->val) {
pMergeHead = pHead1;
pMergeHead->next = Merge1(pHead1->next, pHead2);
}
if (pHead1->val > pHead2->val) {
pMergeHead = pHead2;
pMergeHead->next = Merge1(pHead1, pHead2->next);
}
return pMergeHead;
}