1. 程式人生 > >兩個連結串列的合併

兩個連結串列的合併

題目要求:

注意題目中的一句話要求我們使用原來序列中的結點!那麼我們就不能使用新的記憶體單元,來單獨儲存合併後的連結串列。

【如果申請新記憶體,pta會報段錯誤】

使用原來的結點:優點,節省記憶體;缺點,破壞了原來的連結串列,不能原樣輸出原連結串列##

使用新記憶體單元:優點,儲存原連結串列狀態;缺點,浪費記憶體##

使用原來結點的程式碼:

List Merge(List L1, List L2)
{
    List l1, l2, p, head;
    l1 = L1->Next;
    l2 = L2->Next;
    head = (List)malloc(sizeof(struct Node));
    head->Next = NULL;
    p = head;
    while(l1 && l2)
    {
        if(l1->Data <= l2->Data)
        {
            p->Next = l1;
            p = l1;
            l1 = l1->Next;
        }
        else
        {
            p->Next = l2;
            p = l2;
            l2 = l2->Next;
        }
    }
    if(l1 != NULL)
    {
        p->Next = l1;
    }
    else{
        p->Next = l2;
    }
    L1->Next = NULL;
    L2->Next = NULL;
    return head;
}

不使用原來結點的程式碼:

List Merge(List L1, List L2)
{
  List l1, l2, head, p, t;
  l1 = L1->Next;
  l2 = L2->Next;
  head = (List)malloc(sizeof(struct Node));
  head->Next = NULL;
  p = head;
  while(L1 && L2)
  {
    t = (List)malloc(sizeof(struct Node));
    t->Next = NULL;
    if(l1->Data < l2->Data)
    {
      t->Data = l1->Data;
      p->Next = t;
      p = t;
      l1 = l1->Next;
    }
    else
    {
      t->Data = l2->Data;
      p->Next = t;
      p = t;
      l2 = l2->Next;
    }
  }
   if(!l1)
    p->Next = l1;
  else
    p->Next = l2;
  L1->Next = NULL;
  L2->Next = NULL;
  return head;
}