记——Merge Two Sorted Lists,这题的思路很简单,不过大神的代码中有不懂得地方,因此记下留着以后慢慢研究。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//time limit exceeded
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *p;
ListNode L(0);
p = &L;
while(l1 && l2){
if(l1->val > l2->val){
p->next = l2;
l2 = l2->next;
}else{
p->next = l1;
l1 = l1->next;
}
p = p->next;
}
while(l1!=NULL){
p->next = l1;
}
while(l2!=NULL){
p->next = l2;
}
return L.next;
}
};
//12ms
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
dummy.next = l1;
ListNode *cur = &dummy;
while(l2)
{
while(cur->next && cur->next->val<=l2->val) cur = cur->next; // if the current list, l1, has a smaller value, then move cur forward
l1 = cur->next; // otherwise, switch l1 and l2
cur->next = l2;
l2 = l1;
}
return dummy.next;
}
};
//8ms
//和我的思路一样,但是为什么要用到二重指针,还有为什么要放回head而不是head->next
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = NULL;
ListNode** indirect = &head;
while (l1 && l2) {
if (l1->val < l2->val) {
*indirect = l1;
l1 = l1->next;
}
else {
*indirect = l2;
l2 = l2->next;
}
indirect = &(*indirect)->next;
}
if (l1) {
*indirect = l1;
}
if (l2) {
*indirect = l2;
}
return head;
}
};
//递归的方法
class Solution {
public:
<span style="white-space:pre"> </span>ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
<span style="white-space:pre"> </span>if(l1 == nullptr){
<span style="white-space:pre"> </span>return l2;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(l2 == nullptr){
<span style="white-space:pre"> </span>return l1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(l1->val <= l2->val){
<span style="white-space:pre"> </span>l1->next = mergeTwoLists(l1->next, l2);
<span style="white-space:pre"> </span>return l1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else{
<span style="white-space:pre"> </span>l2->next = mergeTwoLists(l1, l2->next);
<span style="white-space:pre"> </span>return l2;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
};