合并链表 【微软面试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;

}

 

你可能感兴趣的:(面试)