zoukankan      html  css  js  c++  java
  • 合并两个排序的链表递归和非递归C++实现

    题目描述:

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

    1、分析

    已知输入的两个链表递增有序,要使输出的链表依然递增有序,可以依次从输入的两个链表中挑选最小的元素插入到输出的链表尾部,便可实现输出链表递增有序。 

    2、数据结构定义

    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };

    3、递归实现

    /*递归实现合并两个排序链表*/
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1 == NULL)
            return pHead2;
        if(pHead2 == NULL)
            return pHead1;
        if(pHead1->val < pHead2->val)
        {
            pHead1->next = Merge(pHead1->next, pHead2);
            return pHead1;
        }
        else
        {
            pHead2->next = Merge(pHead1, pHead2->next);
            return pHead2;
        }
    }

    4、非递归实现:

    /*非递归实现合并两个排序链表*/
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode *pHead = new ListNode(0);
        ListNode *p = pHead;
        while(pHead1 != NULL && pHead2 != NULL)
        {
            if(pHead1->val < pHead2->val)
            {
                p->next = pHead1;
                pHead1 = pHead1->next;
            }
            else
            {
                p->next = pHead2;
                pHead2 = pHead2->next;
            }
            p = p->next;
        }
        if(pHead1 != NULL)
        {
            p->next = pHead1;
        }
        if(pHead2 != NULL)
        {
            p->next = pHead2;
        }
        return pHead->next;
    }

    5、总结

    这道题使对单链表操作比较经典的题目,无论是考研还是面试出现的概率都非常高。题目的思路较为简单,编码实现稍微难点,难度虽不大,但能考察编码基础功力和对单链表的深一层的理解,所以须熟练掌握。

  • 相关阅读:
    dell N5010
    centos7 teamviewer
    E40笔记本无线网卡
    sqlite的bool字段
    System.data.sqlite安装
    关于AutoResetEvent 和ManualResetEvent
    实时刷新winform中的某一个控件上的文字
    C#中的静态构造函数
    apm的学习资料
    C# 版本和.NET 版本以及VS版本的对应关系
  • 原文地址:https://www.cnblogs.com/evenleee/p/8505981.html
Copyright © 2011-2022 走看看