1.合并两个有序链表
struct ListNode {
int val;
ListNode * next;
ListNode(int x) : val(x), next(NULL) {}
}; //链表
ListNode * mergeTwoLists(ListNode * L1, ListNode * L2) //假设是非递减的链表
{//递归的方式
if (L1 == nullptr ) return L2;
else if (L2 == nullptr) return L1;
if (L1->val < L2->val)
{
L1->next = mergeTwoLists(L1->next, L2);
return L1;
}
else
{
L2->next = mergeTwoLists(L1, L2->next);
return L2;
}
}
ListNode * mergeTwoLists(ListNode * L1, ListNode * L2) //假设是非递减的链表
{//循环的方式
if (L1 == nullptr ) return L2;
else if (L2 == nullptr) return L1;
ListNode *L3 = L1->val < L2->val ? L1 : L2;
if (L3 == L1)L1 = L1->next;
else L2 = L2->next;
ListNode *q = L3;
if (L1->val < L2->val)
{
q->next = L1;
q=L1 = L1->next;
}
else
{
q->next = L2;
q=L2 = L2->next;
}
if (L1 == nullptr) q->next = L2;
else if (L2 == nullptr) q->next = L1;
return L3;
}
2.反转链表
ListNode * reversalList(ListNode * L1)//反转链表
{
if (L1->next == nullptr || L1->next->next == nullptr)return L1;//单个节点或无节点时为本身
//假设是带头结点的单链表
//思路:相当于把原链表节点使用头插法建立新的链表
ListNode * first = L1->next; //原链表的第一个数据节点
ListNode * cur = L1->next->next;
while(first->next !=nullptr)
{
first->next = cur->next;
cur->next = L1->next;
L1->next = cur;//头插法
}
return L1;
}
//不带头结点
ListNode * reversalList(ListNode * L1)//反转链表
{
if (L1 == nullptr || L1->next == nullptr)return L1;//单个节点或无节点时为本身
//假设是不带头结点的单链表
//思路:相当于把原链表节点使用头插法建立新的链表
ListNode * first = L1; //原链表的第一个数据节点
ListNode * firstnow = L1; //头插后的第一个数据节点
ListNode * cur = L1->next;
while(first->next !=nullptr)
{
first->next = cur->next;
cur->next = firstnow;
firstnow = cur;//头插法
}
return L1;
}