题目:现有两个递增的单链表L1和L2,设计一个算法将L1与L2的所有结点归并到递增的单链表L3中。要求:空间复杂度为O(1)。
思路:本题可采用二路归并思路,但题目要求空间复杂度为O(1),因此不能复制结点,只能破坏L1和L2将结点插入到L3中。
代码:
void Merge(LinkList &L1,LinkList &L2,LinkList &L3)
{
LinkList *p=L1.head->next, *q=L2.head->next;
LinkList *p1, *q1, *r;
L1.head->next=NULL; //将L1、L2置为空表
L2.head->next=NULL;
r=L3.head;
while(p!=NULL&&q!=NULL) //两个表均未遍历完时
{
if(p->data<q->data)
{
p1=p->next; //将L1中的结点插入L3
r->next=p;r=p;
p=p1;
}
else
{
q1=q->next; //将L2中的结点插入L3
r->next=q;r=q;
q=q1;
}
}
while(p!=NULL) //若L1未遍历完,将剩余所有结点插入到L3
{
p1=p->next;
r->next=p;r=p;
p=p1;
}
while(q!=NULL) //若L2未遍历完,将剩余所有结点插入到L3
{
q1=q->next;
r->next=q;r=q;
q=q1;
}
r->next=NULL; //将L3尾结点置为NULL
}
该算法中没有新建结点,因此空间复杂度为O(1)。
原文地址:http://blog.csdn.net/u011421608/article/details/46402581