14,合并两个排序链表《剑指offer》
题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
递归版本:每次只判断当前的两个头结点的大小,执行递归操作,返回较小的头结点;
非递归版本:每次需要循环判断出一个结构:
p1-->p2-->p3 ;
o1-->o2-->o3;
其中
当: p1<o1<o2时 :将p1->next指向o1 然后判断o1和p2 这两个(新的)头结点关系,得到同样的结构;
当:o1<p1<o2时,同样的道理
代码:
//递归版本 /* 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; if(pHead1->val<pHead2->val){ pHead1->next=Merge(pHead1->next,pHead2); return pHead1; }else{ pHead2->next=Merge(pHead1,pHead2->next); return pHead2; } } };
//非递归版本: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode* tmpNode; ListNode* newHead; if(pHead1==NULL) return pHead2; if(pHead2==NULL) return pHead1; if(pHead1->val<pHead2->val){ newHead=pHead1; }else{ newHead=pHead2; } while(pHead1!=NULL||pHead2!=NULL){ if(pHead1->val<pHead2->val){ while(pHead1->next!=NULL&&pHead1->next->val<pHead2->val) pHead1=pHead1->next; if(pHead1->next==NULL){ pHead1->next=pHead2; break; }else{ tmpNode=pHead1->next; pHead1->next=pHead2; pHead1=tmpNode; } }else{ while(pHead2->next!=NULL&&pHead2->next->val<pHead1->val) pHead2=pHead2->next; if(pHead2->next==NULL){ pHead2->next=pHead1; break; }else{ tmpNode=pHead2->next; pHead2->next=pHead1; pHead2=tmpNode; } } } return newHead; } };