【问题标题】:Trying to sort a linked list using a merge function?尝试使用合并功能对链表进行排序?
【发布时间】:2014-10-29 03:12:32
【问题描述】:

我写了一个函数来合并两个单链表。例如,如果 A = 1 2 3B = 3 4 5 合并它们,我得到 A = 1 2 3 3 4 5B = NULL。我现在要做的是编写一个函数,该函数使用 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,问题就很简单。
  • 听说过自下而上的归并排序吗?非常适用于链表
  • @Smac89 不是真的,我该如何实现?
  • @sparta93 这是一个带有youtube linkanotherfinallylink。希望有帮助

标签: c++ linked-list mergesort


【解决方案1】:

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

两个指针都从列表的头部开始。一个指针每两步移动一次,而另一个 每次移动一步。 当快指针为空时,慢指针将指向链表的中间。

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

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多