剑指offer(16)—合并两个排序的链表
2017-08-27 00:40
323 查看
合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路
参照归并排序的思想代码
迭代法:/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; if(pHead2 == NULL) return pHead1; ListNode* p1 = pHead1; ListNode* p2 = pHead2; ListNode *pHeadNew, *pcur; if(p1->val < p2->val){ //新链表的头结点为两个链表头结点中的较小值 pHeadNew = p1; p1 = p1->next; }else{ pHeadNew = p2; p2 = p2->next; } pcur = pHeadNew; //不断加入的当前结点 while(p1!=NULL && p2!=NULL){ if(p1->val < p2->val){ //若p1值小于p2值,则取p1,并将其向后移 pcur->next = p1; p1 = p1->next; }else{ pcur->next = p2; p2 = p2->next; } pcur = pcur->next; } if(p1!=NULL){ //链表1还有剩余部分,则依次加入 pcur->next = p1; p1 = p1->next; pcur = pcur->next; } if(p2!=NULL){ //链表2还有剩余部分,则依次加入 pcur->next = p2; p2 = p2->next; pcur = pcur->next; } return pHeadNew; } };
递归法:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; if(pHead2 == NULL) return pHead1; ListNode* p1 = pHead1; ListNode* p2 = pHead2; ListNode *pHeadNew, *pcur; if(p1->val < p2->val){ //新链表的头结点为两个链表头结点中的较小值 pHeadNew = p1; p1 = p1->next; }else{ pHeadNew = p2; p2 = p2->next; } pHeadNew->next = Merge(p1, p2); return pHeadNew; } };
相关文章推荐
- 剑指offer题解C++【16】合并两个排序的链表
- 剑指offer-16.合并两个排序的链表
- 剑指Offer——(16)合并两个排序的链表
- 剑指Offer面试题16反转链表(递归和非递归),面试题17合并两个排序的链表(递归)
- 剑指Offer--16.合并两个排序的链表
- 16、合并两个排序的链表
- 16.合并两个排序的链表
- 剑指Offer系列-面试题17:合并两个排序的链表
- 剑指offer——合并两个排序的链表
- 剑指offer—合并两个排序的链表
- 剑指offer:合并两个排序的链表
- 剑指offer:面试题 17:合并两个排序的链表
- 剑指offer--面试题25:合并两个排序的链表
- 【剑指offer】16合并两个排序的链表
- 剑指offer——16.合并两个排序的链表
- 剑指offer(十六) 合并两个排序的链表
- 剑指offer(面试题17):合并两个已排序的链表
- 合并两个排序的链表(剑指offer)
- [剑指Offer] 16.合并两个排序链表
- 《剑指Offer》题目:合并两个排序的链表