博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合并链表 【微软面试100题 第四十二题】
阅读量:6001 次
发布时间:2019-06-20

本文共 3136 字,大约阅读时间需要 10 分钟。

题目要求:

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

你可能感兴趣的文章
linux shell 数组的使用
查看>>
CSS Sprites
查看>>
10进制转化成2进制,16进制
查看>>
markdown 语法汇总
查看>>
自动登录
查看>>
11.表达式语言
查看>>
3.数据校验和SpringEL
查看>>
面向对象编程-何为对象
查看>>
微信公众平台开发文摘
查看>>
OAF_OAF控件系列1 - Region Type汇总(概念)
查看>>
SPSite, SPWeb Dispose and Class Design Partter
查看>>
alter table添加表约束
查看>>
C# 模拟提交 Form表单的数据
查看>>
shell脚本加密
查看>>
java二维数组求每行最大值,每列最小值,及输出数组主对角线上的元素
查看>>
java代码包装类----------Integer
查看>>
python(56):正则表达式积累
查看>>
发送短信验证码-node+阿里云短信
查看>>
04-爬取单个英雄联盟英雄的符文图片
查看>>
《人员管理》读书笔记
查看>>