尝试使用合并功能对链表进行排序?

时间:2014-10-29 03:12:32

标签: c++ linked-list mergesort

我编写了一个合并两个单链表的函数。例如,如果我A = 1 2 3B = 3 4 5合并它们,我会得到A = 1 2 3 3 4 5B = 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;
}

1 个答案:

答案 0 :(得分:0)

要将列表分成两半,可以使用两个指针。

两个指针都从列表的头部开始。一个指针每两步移动一次,而另一个指针移动 每次移动一步。 当快速指针到达null时,较慢的指针将指向列表的中间位置。

ListNode *fast(head->next), *slow(head); while(fast && fast->next) { fast = fast->next->next; slow = slow->next; }