合并链表 【微软面试100题 第四十二题】

来源:互联网 发布:clojure编程 中文 编辑:程序博客网 时间:2024/04/27 18:00

题目要求:

  两个非降序链表的并集,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;}



0 0