美文网首页数据结构和算法
剑指offer - 合并两个排序的链表

剑指offer - 合并两个排序的链表

作者: Longshihua | 来源:发表于2019-07-30 09:11 被阅读0次

题目

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

例如,输入图3.11中的链表1和链表2,则合并之后升序链表如链表3所示。

1.png

思路:先合并两条链表,在使用两个指针比较值进行交换结点位置

3.png

分析

  • 1、分析两个链表的合并过程

分析从合并两个链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点是合并后的头结点

  • 2、剩余结点的合并

在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面一样。还是比较两个头结点的值。此时链表2的头结点小于链表1的头结点的值,因此链表2的头结点的值将是合并剩余结点得到的链表的头结点。再把这个结点和前面合并链表时得到的链表的尾结点链接起来。

  • 3、最后

两个链表剩余的结点依然是排序的,因此合并的步骤和之前的步骤是一样的,这就是典型的递归过程,可以使用递归函数完成

算法实现

#include <iostream>
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 *pMergeHead = nullptr;

    if (pHead1->m_nValue < pHead2->m_nValue) {
        pMergeHead = pHead1;
        pMergeHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
    } else {
        pMergeHead = pHead2;
        pMergeHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
    }

    return pMergeHead;
}

非递归实现

ListNode *Merge2(ListNode *pHead1, ListNode *pHead2) {
    // 新建一个头节点,用来存合并的链表
    ListNode *head = new ListNode();
    head->m_pNext = nullptr;
    ListNode *root = head;
    while (pHead1 != nullptr && pHead2 != nullptr) {
        if (pHead1->m_nValue < pHead2->m_nValue) {
            head->m_pNext = pHead1;
            head = pHead1;
            pHead1 = pHead1->m_pNext;
        } else {
            head->m_pNext = pHead2;
            head = pHead2;
            pHead2 = pHead2->m_pNext;
        }
    }

    // 把未结束的链表连接到合并后的链表尾部
    if (pHead1 != nullptr) {
        head->m_pNext = pHead1;
    } else if (pHead2 != nullptr) {
        head->m_pNext = pHead2;
    }

    return root->m_pNext;
}

参考

《剑指offer》

相关文章

网友评论

    本文标题:剑指offer - 合并两个排序的链表

    本文链接:https://www.haomeiwen.com/subject/wlusjqtx.html