C/C++面试题—合并两个排序的链表【递归和循环两种方式】

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,
当然我们需要合成后的链表满足单调不减规则。

解题思路

这道题既可以采用递归的方式,也可以采用循环的方式。
2者的思路都是殊途同归的。

合并后的链表头结点指向值域较小的头结点,然后较小的链表往后移动继续和另外一个链表的头结点值域进行比较。
直到将其中一个链表链接完毕,再链接另外一个链表。

解题代码

#include <iostream>
#include "ListNode.h"
using namespace std;
/*

题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,
当然我们需要合成后的链表满足单调不减规则。

*/

class SolutionMerge {
public:
    //递归方式
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if (pHead1 == nullptr)
            return pHead2;
        if (pHead2 == nullptr)
            return pHead1;
        ListNode* mergeHead = nullptr;
        if (pHead1->val < pHead2->val)
        {
            mergeHead = pHead1;
            mergeHead->next = Merge(pHead1->next, pHead2);
        }
        else
        {
            mergeHead = pHead2;
            mergeHead->next = Merge(pHead1, pHead2->next);
        }
        return mergeHead;
    }
    //循环方式
    ListNode* Merge2(ListNode* pHead1, ListNode* pHead2)
    {       
        if (pHead1 == nullptr)
            return pHead2;
        if (pHead2 == nullptr)
            return pHead1;
        ListNode* mergeHead = nullptr;
        if (pHead1->val < pHead2->val)
        {
            mergeHead = pHead1;
            pHead1 = pHead1->next;
        }
        else
        {
            mergeHead = pHead2;
            pHead2 = pHead2->next;
        }
        ListNode* pCur = mergeHead;
        //递归改为循环
        while (pHead1 != nullptr && pHead2 != nullptr)
        {
            if (pHead1->val < pHead2->val)
            {
                pCur->next = pHead1;
                pHead1 = pHead1->next;
            }
            else
            {
                pCur->next = pHead2;
                pHead2 = pHead2->next;
            }
            pCur = pCur->next;
        }
        if (pHead1 == nullptr)
            pCur->next = pHead2;
        if (pHead2 == nullptr)
            pCur->next = pHead1;
        return mergeHead;
    }
    void PrintList(ListNode* pHead)
    {
        if (pHead == nullptr)
            return;
        ListNode* pNode = pHead;
        while (pNode != nullptr)
        {
            cout << pNode->val << endl;
            pNode = pNode->next;
        }
    }
};

int main(int argc, char *argv[])
{
    //测试
    SolutionMerge solution;
    ListNode node1(1);
    ListNode node2(3); node1.next = &node2;
    ListNode node3(5); node2.next = &node3;
    ListNode node4(7); node3.next = &node4;

    ListNode Node1(2);
    ListNode Node2(4); Node1.next = &Node2;
    ListNode Node3(6); Node2.next = &Node3;
    ListNode Node4(8); Node3.next = &Node4;

    ListNode* p1 = solution.Merge(&node1, &Node1);

    solution.PrintList(p1);
    return 0;
}

运行测试

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29542611/article/details/80552270