这道题绝对算是数据结构的经典题型了,之前备考的时候就已经写过无数次了,但之前都是手写的,实际运行起来还是会发现很多问题
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
知识点:链表
解题思路
两个链表从头开始比较,从小到大依次插入到排序链表中,这里要注意插入时新建结点然后插入到新链表中
具体方法:设置指向两个原链表的指针,从头开始遍历,分别比较两个链表中对应的结点数据大小,将小元素放到新链表中,并将此指针后移,继续比较下一个元素,直到某条链表结束,然后将较长链表的剩余元素依次插入
我遇到的问题
- 必须要考虑两个链表同时为空的情况,此时返回NULL
- 排序链表是我新建的,插入时必须先新建结点,才能插入到新链表尾部
- 注意段错误和循环的问题,虽然我知道问题出在哪,但是每次都因为各种原因忘记写(段错误:检查结点在使用前是否判断非空。当后继结点为空时一定要跳出循环)
源代码
/*
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&&pHead2==NULL)
return NULL;
ListNode* p1=pHead1;
ListNode* p2=pHead2;
ListNode* Head=(ListNode*) malloc(sizeof(ListNode));
Head->next=NULL;
ListNode* p=Head;
while(p1!=NULL&&p2!=NULL){
if(p2->val<p1->val){
ListNode* q=(ListNode*) malloc(sizeof(ListNode));
q->next=NULL;
q->val=p2->val;
p->next=q;
p=p->next;
if(p2->next!=NULL)
p2=p2->next;
else{
p2=NULL;
break;
}
}
else{
ListNode* q=(ListNode*) malloc(sizeof(ListNode));
q->next=NULL;
q->val=p1->val;
p->next=q;
p=p->next;
if(p1->next!=NULL)
p1=p1->next;
else{
p1=NULL;
break;
}
}
}
while(p1!=NULL){
ListNode* q=(ListNode*) malloc(sizeof(ListNode));
q->next=NULL;
q->val=p1->val;
p->next=q;
p=p->next;
if(p1->next!=NULL)
p1=p1->next;
else break;
}
while(p2!=NULL){
ListNode* q=(ListNode*) malloc(sizeof(ListNode));
q->next=NULL;
q->val=p2->val;
p->next=q;
p=p->next;
if(p2->next!=NULL)
p2=p2->next;
else break;
}
return Head->next;
}
};