题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
1. 分析
分递归和非递归两种方式,主要思路如下:
- 比较两个链表的首结点,哪个小的的结点则合并到第三个链表尾结点,并向前移动一个结点;
- 步骤一结果会有一个链表先遍历结束,或者没有第三个链表尾结点指向剩余未遍历结束的链表;
- 返回第三个链表首结点。
2. 用C++写出逻辑
// 非递归版本
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode* vHead = new ListNode(-1);
ListNode* cur = vHead;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while(p1 && p2){
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;
return vHead -> next;
}
// 递归版本
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == nullptr)
return pHead2;
if(pHead2 == nullptr)
return pHead1;
ListNode* vHead = new ListNode(-1);
if(pHead1 -> val < pHead2 -> val){
vHead = pHead1;
vHead -> next = Merge(pHead1 -> next, pHead2);
}
else{
vHead = pHead2;
vHead -> next = Merge(pHead1, pHead2 -> next);
}
return vHead;
}