合并链表 【微软面试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;
}
原文地址:https://www.cnblogs.com/tractorman/p/4079671.html