lettcode21. Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
从小到大排列的两个数组,合并成一个数组。递归的方法。注意:两个数组都为空的情况。
This solution is not a tail-recursive, the stack will overflow while the list is too long
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1==NULL) return l2; if(l2==NULL) return l1; if(l1->val>l2->val){ ListNode *tmp=l2; tmp->next=mergeTwoLists(l1,l2->next); return tmp; } else{ ListNode *tmp=l1; tmp->next=mergeTwoLists(l1->next,l2); return tmp; } } };
2.新建了一个临时列表tmp,用时12ms,比上面多3ms(是什么原因呢?)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode head(-1); ListNode *tmp=&head; while(l1&&l2){ if(l1->val<l2->val){ tmp->next=l1; l1=l1->next; }else{ tmp->next=l2; l2=l2->next; } tmp=tmp->next; } if(l1) tmp->next=l1; if(l2) tmp->next=l2; return head.next; } };