又是一个经典的问题,合并两个有序的链表。用归并排序,两个指针分别扫描一遍。复杂度O(n)。链表、指针的使用要小心。顺序很重要。
/**
* 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;
ListNode* tail;
ListNode* p=l1;
ListNode* q=l2;
if(p==NULL) return l2;
if(q==NULL) return l1;
if(p->val <= q->val){
head=tail=p;
p=p->next;
tail->next=NULL;
}
else{
head=tail=q;
q=q->next;
tail->next=NULL;
}
while(p&&q){
if(p->val <= q->val){
tail->next=p;
tail=p;
p=p->next;
tail->next=NULL;
}
else{
tail->next=q;
tail=q;
q=q->next;
tail->next=NULL;
}
}
if(p) tail->next=p;
else tail->next=q;
return head;
}
};
一开始我是这种写法, 区别只是我先声明一个临时的指针来赋值,结果RE了,我猜想是不能这么用,至今不明白
/**
* 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;
ListNode* tail;
ListNode* p=l1;
ListNode* q=l2;
if(p==NULL) return l2;
if(q==NULL) return l1;
if(p->val <= q->val){
ListNode* tmp; //用一个临时的指针来赋值
tmp->val=p->val;<span style="white-space:pre"> </span>//猜想是不是指针不能这么用!!!!
tmp->next=NULL;
head=tail=tmp;
p=p->next;
delete tmp;
}
else{
ListNode* tmp;
tmp->val=q->val; //同理
tmp->next=NULL;
head=tail=tmp;
q=q->next;
delete tmp;
}
while(q&&p){
if(p->val <= q->val){
ListNode* tmp;<span style="white-space:pre"> </span>//同理
tmp->val=p->val;
tmp->next=NULL;
tail->next=tmp;
tail=tmp;
p=p->next;
delete tmp;
}
else{
ListNode* tmp; //同理
tmp->val=q->val;
tmp->next=NULL;
tail->next=tmp;
tail=tmp;
q=q->next;
delete tmp;
}
}
if(p) tail->next=p;
else tail->next=q;
return head;
}
};