剑指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);
}
posted @ 2022-05-08 23:45  epiphanyy  阅读(11)  评论(0)    收藏  举报  来源