1.合并两个有序链表,合并以后的链表依旧有序。
合并两个有序链表,可以分为以下几种情况:
a)当要合并的两条链表都为空,返回空;
b)当一个链表为空;此时我们直接返回好另一条链表即可;
c)都不为空,两个链表进行合并;
在此中由于我们不知道链表1和链表2应该以谁为头,因此.我们自己定义新链表的头;然后注意进行比较,逐次向表头链接;
当其中一个链接完成后,由于其有序,直接将后一个没有连完挂在后面即可.
下面为代码:
#include <iostream>
#include <assert.h>
using namespace std;
typedef struct ListNode
{
int _data;
struct ListNode* _next;
ListNode(const int x)
:_data(x)
,_next(NULL)
{}
}ListNode;
void Push(ListNode** list,int x)
{
assert(list);
ListNode* tmp = new ListNode(x);
if (*list == NULL) //没有元素
{
*list = tmp;
}
else
{
ListNode* cur = *list;
while (cur->_next) //
{
cur = cur->_next;
}
cur->_next = tmp;
}
}
ListNode* ListMerge(ListNode* l1,ListNode* l2)
{
if(l1 == NULL)
{
return l2;
}
if(l2 == NULL)
{
return l1;
}
ListNode* head = NULL; //合并后的头指针
ListNode* p1 = l1; //p1用于扫描链表1
ListNode* p2 = l2; //p2用于扫描链表2
if(l1->_data < l2->_data) //确定头
{
head=l1;
p1=l1->_next;
}
else
{
head=l2;
p2=l2->_next;
}
ListNode* p=head; //p永远指向最新合并的结点
while(p1 && p2) //如果循环停止,则p1或p2至少有一个为NULL
{
if(p1->_data < p2->_data)
{
p->_next=p1;
p1=p1->_next;
}
else
{
p->_next=p2;
p2=p2->_next;
}
p=p->_next;
}
if(p1 != NULL)//如果链1还没走完
{
p->_next=p1;
}
else if(p2 != NULL)//如果链2还没走完
{
p->_next=p2;
}
return head;
}
int main()
{
ListNode* l1 = NULL;
Push(&l1,1);
Push(&l1,3);
Push(&l1,5);
Push(&l1,7);
Push(&l1,9);
ListNode* l2 = NULL;
Push(&l2,2);
Push(&l2,4);
Push(&l2,6);
Push(&l2,8);
Push(&l2,10);
ListNode* a = ListMerge(l1,l2);
while (a)
{
cout<<a->_data<<" ";
a = a->_next;
}
cout<<endl;
return 0;
}
2.实现1+2+3…+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。