zoukankan      html  css  js  c++  java
  • 合并链表 【微软面试100题 第四十二题】

    题目要求:

      两个非降序链表的并集,1->2->3和2->3->5合并为1->2->3->5.

      另外只能输出结果,不能修改两个链表的数据。

    题目分析:

      1.不能修改原链表数据:即,输出1->2->3->5后,原来的两个链表还是1->2->3和2->3->5。因此输出的这些结点都需要重新申请空间存放,不能使用原来的结点。

      2.去掉相同值的结点。即,如果head1为1->2->2->3,head2为NULL,输出都不是head1,而是1->2->3.

    代码实现:

    #include <iostream>
    
    using namespace std;
    
    typedef struct ListNode
    {
        struct ListNode *next;
        int data;
    }ListNode;
    
    ListNode *MergeTwoList(ListNode *h1,ListNode *h2);
    void initList(ListNode **head1,ListNode **head2);
    
    int main(void)
    {
        ListNode *head1,*head2;
        ListNode *mergeList;
    
        initList(&head1,&head2);
        mergeList = MergeTwoList(head1,head2);
        while(mergeList)
        {
            cout << mergeList->data << "->";    
            mergeList = mergeList->next;
        }
        cout << "NULL" << endl;
    
        return 0;
    }
    ListNode *Handle(ListNode *h)
    {
        if(h==NULL)
            return NULL;
        
        int last = h->data;
        ListNode *tmp = new ListNode;
        tmp->data = h->data;
        tmp->next = NULL;
        ListNode *head = tmp;
        h = h->next;
    
        ListNode *tmp2;
        while(h)
        {
            if(last!=h->data)
            {
                tmp2 = new ListNode;
                tmp2->data = h->data;
                tmp2->next = NULL;
                tmp->next = tmp2;
                tmp = tmp2;
                last = tmp2->data;
            }
            h = h->next;
        }
        return head;
    }
    ListNode *MergeTwoList(ListNode *h1,ListNode *h2)
    {
        if(h1==NULL) return Handle(h2);
        if(h2==NULL) return Handle(h1);
    
        ListNode *head,*tmp,*tmp1;
        int last;
    
        if(h1->data < h2->data)
        {
            tmp = new ListNode;
            tmp->data = h1->data;
            last = h1->data;
            tmp->next = NULL;
            head = tmp;
            h1 = h1->next;
        }
        else
        {
            tmp = new ListNode;
            tmp->data = h2->data;
            last = h2->data;
            tmp->next = NULL;
            head = tmp;
            h2 = h2->next;
        }
    
        while(h1!=NULL && h2!=NULL)
        {
            if(h1->data < h2->data)
            {
                if(h1->data!=last)
                {
                    tmp1 = new ListNode;
                    tmp1->data = h1->data;
                    last = h1->data;
                    tmp1->next = NULL;
                    tmp->next = tmp1;
                    tmp = tmp1;
                }
                h1 = h1->next;
            }
            else
            {
                if(h2->data!=last)
                {
                    tmp1 = new ListNode;
                    tmp1->data = h2->data;
                    last = h2->data;
                    tmp1->next = NULL;
                    tmp->next = tmp1;
                    tmp = tmp1;
                }
                h2 = h2->next;
            }
        }
        if(h1!=NULL)
            tmp->next = Handle(h1);
        if(h2!=NULL)
            tmp->next = Handle(h2);
        return head;
    }
    void initList(ListNode **head1,ListNode **head2)
    {
        ListNode *tmp = new ListNode;
        tmp->data = 1;
        *head1 = tmp;
    
        tmp = new ListNode;
        tmp->data = 2;
        (*head1)->next = tmp;
    
        ListNode *tmp1 = new ListNode;
        tmp1->data = 2;
        tmp1->next = NULL;
        tmp->next = tmp1;
    
        //-----------------------------
        tmp = new ListNode;
        tmp->data = 1;
        *head2 = tmp;
    
        tmp = new ListNode;
        tmp->data = 3;
        (*head2)->next = tmp;
    
        tmp1 = new ListNode;
        tmp1->data = 5;
        tmp1->next = NULL;
        tmp->next = tmp1;
    }
  • 相关阅读:
    在线用户数与并发用户数的区别和比例关系
    MYSQL中数据类型介绍
    5分钟教你搞定RAID模式
    nginx与fastdfs配置详解与坑
    Fastdfs group通过添加硬盘扩容
    fastDfs配置文件tracker.conf配置详解
    FastDFS配置详解之Storage配置
    mysql修改库名
    vCenter Server Appliance(VCSA )6.7部署指南
    如何知道一个函数的执行时间简单案例
  • 原文地址:https://www.cnblogs.com/tractorman/p/4079671.html
Copyright © 2011-2022 走看看