您的位置:首页 > 职场人生

合并两个有序的链表为有序链表

2013-07-21 23:57 134 查看
问题描述:

将两个已经排序的单向链表合并为一个链表,要求空间复杂度尽可能的小。

本题两个注意事项:

第一,任何题目都有时间和空间的要求,所以不要想当然地重建一个链表,这样会带来空间的浪费

第二,该题可以用两种方法来实现,递归和循环,在写答案之前,可以和面试官交流

具体代码如下

(i)递归方法:
struct listNode
{
int data;
listNode *next;
};
listNode *mergeList(listNode *p1,listNode *p2)
{
if(p1==NULL)
{
return p2;
}
if(p2==NULL)
{
return p1;
}
listNode *next;
if(p1->data<p2->data)
{
next=mergeList(p1->next,p2);
p1->next=next;
return p1;
}else
{
next=mergeList(p1,p2->next);
p2->next=next;
return p2;
}

}


 (ii)循环解法:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
struct listNode
{
int data;
listNode *next;
};
listNode *mergeList(listNode *p1,listNode *p2)
{
if(p1==NULL)
{
return p2;
}
if(p2==NULL)
{
return p1;
}
listNode *newHead,*cur;
if(p1->data<p2->data)
{
newHead=p1;
p1=p1->next;
}else
{
newHead=p2;
p2=p2->next;
}
cur=newHead;
while(p1!=NULL && p2!=NULL)
{
if(p1->data<p2->data)
{
cur->next=p1;
p1=p1->next;
cur=cur->next;
}else
{
cur->next=p2;
p2=p2->next;
cur=cur->next;
}
}

cur->next=p2->next==NULL?p1:p2;
return newHead;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 面试 链表