剑指offer 学习笔记 合并两个排序的链表
面试题25:合并两个排序的链表。输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。链表节点定义如下:
struct ListNode {
int m_nValue;
ListNode* m_pNext;
};
当链表1的头节点的值小于链表2的头节点的值时,那么链表1的头节点是合并后链表的头节点。之后在链表中的节点还是排序的,因此之后的合并过程和前面是一样的,我们可以递归地解决这个问题:
#include <iostream>
#include <stack>
using namespace std;
struct ListNode {
int m_nValue;
ListNode* m_pNext;
};
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { // 合并两个排序链表
if (pHead1 == nullptr) { // 当一个链表为空时,直接返回另一个链表
return pHead2;
} else if (pHead2 == nullptr) {
return pHead1;
}
ListNode* pHead = nullptr;
if (pHead1->m_nValue < pHead2->m_nValue) {
pHead = pHead1;
pHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
} else {
pHead = pHead2;
pHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
}
return pHead;
}
void AddToTail(ListNode** pHead, int value) { // 尾插法
ListNode* pNew = new ListNode(); // 为新结点分配内存
pNew->m_nValue = value;
pNew->m_pNext = nullptr;
if (*pHead == nullptr) { // 如果是空链表
*pHead = pNew;
} else {
ListNode* pNode = *pHead;
while (pNode->m_pNext != nullptr) { // 找到链表末尾
pNode = pNode->m_pNext;
}
pNode->m_pNext = pNew; // 将链表末尾元素的指针指向新节点
}
}
void printListReversingly_iteratively(ListNode* pHead) {
stack<ListNode*> nodes;
ListNode* pNode = pHead;
while (pNode != nullptr) { // 将链表从头到尾压栈
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while (!nodes.empty()) { // 打印栈中内容
cout << nodes.top()->m_nValue << endl; // 打印栈顶值
nodes.pop(); // 栈顶元素出栈
}
}
int main() {
ListNode* pHead1 = new ListNode();
pHead1->m_nValue = 0;
pHead1->m_pNext = nullptr;
AddToTail(&pHead1, 1);
AddToTail(&pHead1, 3);
AddToTail(&pHead1, 5);
AddToTail(&pHead1, 7);
ListNode* pHead2 = new ListNode();
pHead2->m_nValue = 0;
pHead2->m_pNext = nullptr;
AddToTail(&pHead2, 2);
AddToTail(&pHead2, 4);
AddToTail(&pHead2, 6);
AddToTail(&pHead2, 8);
ListNode *pHead = Merge(pHead1, pHead2);
printListReversingly_iteratively(pHead);
}
浙公网安备 33010602011771号