我编写了一个合并两个单链表的函数。例如,如果我A = 1 2 3
和B = 3 4 5
合并它们,我会得到A = 1 2 3 3 4 5
和B = NULL
。我现在要做的是编写一个函数,使用mergesort算法对单个链表进行排序(以某种方式使用我的合并函数)。对于mergesort,如果我没有错,我将不得不以某种方式将链表分成两半,然后完成剩下的工作。我写了一个关于我想怎么做的小轮廓。我现在不确定如何进行分裂。任何帮助表示赞赏!
List mergeSort(List L) {
if(|L| > 1) {
split L into L1 and L2;
L1 = mergeSort(L1);
L2 = mergeSort(L1);
return(merge(L1,L2));
}
}
我的合并功能如下:
void mylist::merge(mylist& b)
{
if (!this->isSorted() || !b.isSorted())
cout << "error" << endl;
Node* ptr1 = b.head;
Node* prev_a = NULL;
Node* curr_a = head;
Node* curr_b = ptr1;
while (curr_b) {
if (curr_a && head->key < ptr1->key) {
prev_a=curr_a;
curr_a = curr_a->next;
}
else {
Node* b_next = curr_b->next;
curr_b->next = curr_a;
if (prev_a) prev_a->next = curr_b;
else head = curr_b; // curr_b is first element in 'a'
prev_a = curr_b;
curr_b = b_next;
}
return;
}
答案 0 :(得分:0)
要将列表分成两半,可以使用两个指针。
两个指针都从列表的头部开始。一个指针每两步移动一次,而另一个指针移动 每次移动一步。 当快速指针到达null时,较慢的指针将指向列表的中间位置。
ListNode *fast(head->next), *slow(head);
while(fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}