输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
最开始的做法:
/* 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* newHead,*temp ; if(pHead1->val <= pHead2->val) { newHead = pHead1; pHead1 = pHead1->next; } else { newHead = pHead2; pHead2 = pHead2->next; } temp = newHead; while(pHead1!=NULL && pHead2 != NULL) { if(pHead1->val <= pHead2->val) { newHead->next = pHead1; pHead1 = pHead1->next; } else { newHead->next = pHead2; pHead2 = pHead2->next; } newHead = newHead->next; } if(pHead2 == NULL) { newHead->next = pHead1; } if(pHead1 == NULL) { newHead->next = pHead2; } return temp; } };
改进一些的做法:
class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; if(pHead2 == NULL) return pHead1; ListNode* newHead = NULL; ListNode *temp = NULL; while(pHead1!=NULL && pHead2 != NULL) { if(pHead1->val <= pHead2->val) { if(newHead == NULL) temp = newHead = pHead1; else { newHead->next = pHead1; newHead = newHead->next; } pHead1 = pHead1->next; } else { if(newHead == NULL) temp = newHead = pHead2; else { newHead->next = pHead2; newHead = newHead->next; } pHead2 = pHead2->next; } } if(pHead2 == NULL) { newHead->next = pHead1; } if(pHead1 == NULL) { newHead->next = pHead2; } return temp; } };
递归版本:
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; } }