剑指offer-面试题17.合并两个排序的链表
来源:互联网 发布:无锡胡埭加工中心编程 编辑:程序博客网 时间:2024/05/22 06:25
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。
例如链表1链表2合并为链表3.
1 List1:1->3->5->723 List2:2->4->6->84 5 List3:1->2->3->4->5->6->7->8
链表结点定义如下:
1 struct ListNode2 {3 int m_nValue;4 ListNode* m_pNext;5 }
其实我们可以简单梳理下流程如下:
1.两个指针分别指向List1和List2的头结点。设为ptr1和ptr2
2.比较ptr1和ptr2结点的值,ptr1<ptr2则ptr1则是合并后的链表头结点
3.ptr1向后移动一个结点此时再比较 ptr1>ptr2则将ptr2的节点插入到头结点之后
4.当ptr1或者ptr2到达末尾时 比如ptr1到达List1结尾后 若此时ptr2还未到List2结尾将ptr2插入到新排序的链表后面.
代码实现如下:
1 #include <iostream> 2 using namespace std; 3 4 struct ListNode 5 { 6 int data; 7 struct ListNode *next; 8 }; 9 10 struct ListNode* CreateList() 11 { 12 struct ListNode* Head,*p; 13 Head=(struct ListNode*)malloc(sizeof(ListNode)); 14 Head->data=0; 15 Head->next=NULL; 16 p=Head; 17 18 cout<<"Create List....(0-exit!)"<<endl; 19 while(true) 20 { 21 int Data; 22 cin>>Data; 23 if(Data!=0) 24 { 25 struct ListNode* NewNode; 26 NewNode=(struct ListNode*)malloc(sizeof(ListNode)); 27 NewNode->data=Data; 28 NewNode->next=NULL; 29 p->next=NewNode; 30 p=p->next; 31 } 32 else 33 { 34 break; 35 } 36 } 37 38 return Head->next; 39 } 40 41 void PrintList(struct ListNode* Head) 42 { 43 cout<<"The List is: "; 44 45 struct ListNode *p; 46 p=Head; 47 while(p!=NULL) 48 { 49 cout<<p->data<<" "; 50 p=p->next; 51 } 52 cout<<endl; 53 } 54 55 struct ListNode* Merge(ListNode* pHead1,ListNode* pHead2) 56 { 57 if(pHead1==NULL&&pHead2==NULL) 58 return NULL; 59 60 if(pHead1==NULL&&pHead2!=NULL) 61 return pHead2; 62 63 if(pHead1!=NULL&&pHead2==NULL) 64 return pHead1; 65 66 struct ListNode *ptr1,*ptr2,*MergeList,*newhead;; 67 68 ptr1=pHead1; 69 ptr2=pHead2; 70 71 if(ptr1->data>ptr2->data) 72 { 73 MergeList=ptr2; 74 ptr2=ptr2->next; 75 } 76 else 77 { 78 MergeList=ptr1; 79 ptr1=ptr1->next; 80 } 81 82 newhead=MergeList; 83 84 while(ptr1!=NULL&&ptr2!=NULL) 85 { 86 if(ptr1->data>ptr2->data) 87 { 88 MergeList->next=ptr2; 89 ptr2=ptr2->next; 90 MergeList=MergeList->next; 91 } 92 93 if(ptr1->data<ptr2->data) 94 { 95 MergeList->next=ptr1; 96 ptr1=ptr1->next; 97 MergeList=MergeList->next; 98 } 99 }100 101 if(ptr1!=NULL)102 {103 while(ptr1!=NULL)104 {105 MergeList->next=ptr1;106 ptr1=ptr1->next;107 MergeList=MergeList->next;108 }109 MergeList->next=NULL;110 }111 if(ptr2!=NULL)112 {113 while(ptr2!=NULL)114 {115 MergeList->next=ptr2;116 ptr2=ptr2->next;117 MergeList=MergeList->next;118 }119 MergeList->next=NULL;120 }121 122 123 return newhead;124 }125 126 int main()127 {128 ListNode *List1,*List2,*MergeList;129 List1=CreateList();130 PrintList(List1);131 List2=CreateList();132 PrintList(List2);133 MergeList=Merge(List1,List2);134 PrintList(MergeList);135 return 0;136 }
运行截图:
1 0
- 《剑指Offer》面试题:合并两个排序的链表
- 剑指offer面试题 合并两个排序的链表
- 面试题19:合并两个排序的链表(offer)
- 剑指offer-面试题17.合并两个排序的链表
- 剑指offer面试题17-:合并两个排序链表
- [剑指offer][面试题17]合并两个排序的链表
- 剑指offer 面试题17 合并两个排序的链表
- 剑指Offer:面试题题17 合并两个排序的链表
- 《剑指Offer》面试题17:合并两个排序的链表
- 《剑指Offer》学习笔记--面试题17:合并两个排序的链表
- 剑指offer 面试题17—合并两个排序的链表
- 剑指Offer--面试题17:合并两个排序的链表--Java实现
- 【剑指Offer学习】【面试题17 ::合并两个排序的链表】
- 【剑指Offer面试题】 九度OJ1519:合并两个排序的链表
- 剑指Offer面试题17(Java版):合并两个排序的链表
- 剑指offer面试题17-合并两个排序的链表
- 剑指offer代码解析——面试题17合并两个排序的链表
- 剑指offer-面试题17:合并两个排序的链表
- Hdu1068(二分图的最大匹配)
- cloudstack 添加物理主机可能错误总结
- 【湖南集训 4.7】yist
- Android-通过Java代码来实现属性动画
- hrbust 1426 集训队的晚饭【dp】
- 剑指offer-面试题17.合并两个排序的链表
- ToolBar的使用
- 学习c++之前需要准备什么?
- 虚幻4 Task的创建和执行
- Linux 下的DMA浅析
- mysql(二)——select显示、where、%、排序、limit、distinct、count、max等、删和改
- object 类 “equals” 方法与 “ == " 之间的差别
- LeetCode------Add Two Numbers
- orientdb做图数据库的脚本命令