找环的开始:两个指针一个走两步一个走一步
找两根链表合并的节点:让长链表先走k步,k是长度差
链表排序:(直接在这敲的 没测试 不知道对错)
// 插入排序
LinkNokde* LinkSort (LinkNokde* head) {
LinkNokde *p, *q;
if (head == NULL || head->next == NULL) {
return head;
}
LinkNokde *newhead = new LinkNokde();
newhead->next = head;
p = head->next;
head->next = NULL;
LinkNokde *tmp1, *tmp2;
while (p != NULL) {
q = p->next;
tmp1 = newhead;
tmp2 = newhead->next;
while (tmp2 != NULL) {
if (tmp2->val > p->val) {
p->next = tmp2;
tmp1->next = p;
break;
}
tmp2 = tmp2->next;
tmp1 = tmp1->next;
}
if (tmp2 == NULL) {
tmp1->next = p;
p->next = NULL;
}
p = q;
}
p = newhead->next;
delete(newhead);
return p;
}
// 快速排序
LinkNokde* LinkSort (LinkNokde* head) {
LinkNokde *p, *q , *pivot;
if (head == NULL || head->next == NULL) {
return head;
}
pivot = head;
p = pivot->next;
LinkNokde *dummy1 = new LinkNokde();
LinkNokde *dummy2 = new LinkNokde();
dummy1->next = NULL;
dummy2->next = NULL;
while (p != NULL) {
q = p->next;
if (p->val < pivot->val) {
p->next = dummy1->next;
dummy1->next = p;
} else {
p->next = dummy2->next;
dummy2->next = p;
}
p = q;
}
dummy1->next = LinkSort(dummy1->next);
dummy2->next = LinkSort(dummy2->next);
p = dummy1;
while (p->next != NULL) {
p = p->next;
}
p->next = pivot;
pivot->next = dummy2->next;
p = dummy1->next;
delete(dummy1);
delete(dummy2);
return p;
}