链表=指针=保证鲁棒性=检查空指针
这里用了两种方法:分别是递归和循环
递归:因为两条链表分别都是有序的,所以当一条链表的头结点为空指针时,返回另一条链表头结点即可,两条都空也没事,也就是返回一个空指针。接下来两个指针都不是空指针,定义一个指针,将当前两条链表的头结点值较小的那个赋值给这个指针。这个指针的next递归调用该函数,参数值那里改一下就行,将头结点赋给cur的往后移一位。最后返回cur即可。
循环:开头的检查是一样的,一条链表的头结点为空指针时,返回另一条链表头结点。定义一个mergeNode为空结点,它作为最后形成的单链表的头结点。再定义一个cur用来指向两条链表中比较小的那一个。这样只需要在一开始将cur和mergeNode指向同一个结点即可,只要不断改cur,mergeNode最后指向的就是一条有序的链表。while循环的条件是两条链表的当前头结点均不为空,因为只要有一个为空就很方便了,将cur的next指向另一条即可。判断p1和p2谁更大,再判断是不是第一次赋值,用mergeNode是否为空来判断,如果是第一次,将小的那个结点赋值给mergeNode和cur。如果不是第一次,就将小的那个赋值给cur->next,cur=cur->next。小的那个结点指向它自己的next。循环结束后,判断哪条链表先为空了,将cur->next指向非空的头结点。最后返回mergeNode
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
/*static bool cmp(ListNode* a, ListNode* b){
return a->val < b->val;
}*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
//涉及到指针的题一定要考虑空间鲁棒性
//:法一:递归
/*if(pHead1 == NULL){
return pHead2;
}
else if(pHead2 == NULL){
return pHead1;
}
ListNode *cur;//分别指向两条链表
if(pHead1->val <= pHead2->val){
cur = pHead1;
cur->next = Merge(pHead1->next,pHead2);
}
else{
cur = pHead2;
cur->next = Merge(pHead1,pHead2->next);
}
return cur;*/
//法2:循环
if(pHead1 == NULL){
return pHead2;
}
else if(pHead2 == NULL){
return pHead1;
}
ListNode* mergeNode = NULL;//一个用来记录最后结果
ListNode* cur = NULL;//一个用来寻找下一个较小的结点,因为改了cur,mergeNode也会改
while(pHead1 != NULL && pHead2 != NULL){
if(pHead1->val < pHead2->val){
if(mergeNode == NULL){
mergeNode = cur = pHead1;
}
else{
cur->next = pHead1;
cur = cur->next;
}
pHead1 = pHead1->next;//这里改了也没事,只是改了指针指向别的地方,并没有改next的值
}
else{
if(mergeNode == NULL){
mergeNode = cur = pHead2;
}
else{
cur->next = pHead2;
cur = cur->next;
}
pHead2 = pHead2->next;
}
}
if(pHead1 == NULL){
cur->next = pHead2;
}
if(pHead2 == NULL){
cur->next = pHead1;
}
return mergeNode;
}
};