最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++ 如何合并兩個(gè)有序鏈表

 更新時(shí)間:2020年08月12日 11:45:50   作者:Dabelv  
這篇文章主要介紹了c++ 如何合并兩個(gè)有序鏈表,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下

1.題目要求

這是一道求職面試時(shí)經(jīng)常要求手寫或者機(jī)試的經(jīng)典題目。

已知兩個(gè)鏈表head1和head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。結(jié)果鏈表要包含head1和head2的所有節(jié)點(diǎn),即使節(jié)點(diǎn)值相同。

注意:不能開辟新空間來(lái)存儲(chǔ)合并后的鏈表。如果第一次做該題,很容易會(huì)想到使用新鏈表來(lái)存儲(chǔ)合并后的有序鏈表。雖然可以如此實(shí)現(xiàn),但是不符合常規(guī)解法和面試官的要求。

2.非遞歸實(shí)現(xiàn)

算法過(guò)程:
 輸入:兩個(gè)有序的單鏈表head1與head2;
 輸出:合并后的有序單鏈表mergeHead;
 算法描述:
 (1)如果head1或head2為空鏈表,則直接返回另外一個(gè)鏈表;
 (2)選擇head1與head2鏈表當(dāng)前節(jié)點(diǎn)值較小的節(jié)點(diǎn),掛接到后并后的鏈表mergeHead;
 (3)重復(fù)步驟2,直到鏈表head1或者h(yuǎn)ead2遍歷完成,未遍歷完的鏈表,直接掛接到mergeHead的尾節(jié)點(diǎn)。

具體實(shí)現(xiàn)如下:

#include <sstream>
#include <iostream>
using namespace std;

struct ListNode 
{ 
  int     value; 
  ListNode*  next;
  ListNode() {value=0;next=NULL;}
  ListNode(int value,ListNode* next = NULL):value(value),next(next){} 
};

//@brief:非遞歸實(shí)現(xiàn)兩個(gè)有序單鏈表
//@注意:兩個(gè)鏈表需要從小到大順序排列
ListNode* mergeOrderedLinkedList(ListNode* head1,ListNode* head2)
{
  if (head1 == NULL) 
  { 
    return head2; 
  }
  else if(head2 == NULL) 
  { 
    return head1; 
  }

  ListNode* mergeHead = NULL; 
  if (head1->value<head2->value) 
  { 
    mergeHead=head1;
    head1=head1->next;
  } 
  else 
  { 
    mergeHead = head2; 
    head2 = head2->next; 
  } 
  ListNode* tmpNode = mergeHead; 
  while(head1&&head2)
  { 
    if(head1->value<head2->value) 
    { 
      mergeHead->next = head1; 
      head1 = head1->next; 
    } 
    else 
    { 
      mergeHead->next = head2; 
      head2 = head2->next; 
    } 
    mergeHead = mergeHead->next; 
  } 
  if (head1)
  { 
    mergeHead->next = head1; 
  } 
  if (head2) 
  { 
    mergeHead->next = head2; 
  }

  return tmpNode; 
}

//打印鏈表
void printLinkedList(ListNode* head)
{
  while(head)
  {
    cout<<head->value<<" ";
    head=head->next;
  }
  cout<<endl;
}

int main(int argc,char* argv[])
{
  ListNode* head1=NULL,*curList1=NULL,*head2=NULL,*curList2=NULL;
  string strIn;
  int value;

  cout<<"創(chuàng)建鏈表1,從小到大順序輸入鏈表1:"<<endl;
  getline(cin,strIn);
  stringstream ss(strIn);
  cout<<"ss0 strIn:"<<ss.str()<<endl;
  while(ss>>value)    //從string中按照空格讀取int
  {
    ListNode* newNode1=new ListNode;
    newNode1->value=value;
    if(head1==NULL && curList1==NULL)
    {
      head1=newNode1;
      curList1=newNode1;
    }
    else
    {
      curList1->next=newNode1;
      curList1=curList1->next;
    }
  }

  cout<<"創(chuàng)建鏈表2,從小到大順序輸入鏈表2:"<<endl;
  getline(cin,strIn);
  ss.clear(); //清空狀態(tài)
  ss.str(""); //清空內(nèi)容
  ss<<strIn;  //重新輸出至string
  cout<<"ss1 strIn:"<<ss.str()<<endl;
  while(ss>>value)    //從string中按照空格讀取int
  {
    ListNode* newNode2=new ListNode;
    newNode2->value=value;
    if(head2==NULL && curList2==NULL)
    {
      head2=newNode2;
      curList2=newNode2;
    }
    else
    {
      curList2->next=newNode2;
      curList2=curList2->next;
    }
  }

  //合并兩個(gè)有序鏈表
  ListNode* mergeHead=mergeOrderedLinkedList(head1,head2);

  //打印鏈表
  cout<<"合并后鏈表:"<<endl;
  printLinkedList(mergeHead);
}

運(yùn)行程序,輸出結(jié)果:

從小到大順序輸入鏈表1:
1 2 3 5
ss0 strIn:1 2 3 5
從小到大順序輸入鏈表2:
3 4 5 6 7 8
ss1 strIn:3 4 5 6 7 8
合并后鏈表:
1 2 3 3 4 5 5 6 7 8

3.遞歸實(shí)現(xiàn)

從上面合并兩個(gè)有序鏈表的步驟中可以看出,每次合并的步驟(2)都是一樣的,由此我們想到了遞歸。具體實(shí)現(xiàn)如下:

//@brief:遞歸實(shí)現(xiàn)兩個(gè)有序單鏈表
//@注意:兩個(gè)鏈表需要從小到大順序排列
ListNode* mergeOrderedLinkedListRecursion(ListNode* head1,ListNode* head2)
{
  if(head1 == NULL) 
  { 
    return head2; 
  }
  else if(head2 == NULL) 
  { 
    return head1; 
  }

  ListNode* mergeHead = NULL;
  if(head1->value<head2->value) 
  {
    mergeHead=head1;
    mergeHead->next=mergeOrderedLinkedListRecursion(head1->next,head2);
  }
  else
  {
    mergeHead=head2;
    mergeHead->next=mergeOrderedLinkedListRecursion(head1,head2->next);
  }
  return mergeHead;
}

以上就是c++ 如何合并兩個(gè)有序鏈表的詳細(xì)內(nèi)容,更多關(guān)于c++ 合并兩個(gè)有序鏈表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    很多時(shí)候?yàn)榱朔奖丬浖氖褂?我們需要讓編寫的界面程序顯示在最上層,這時(shí)候就需要對(duì)窗口屬性進(jìn)行調(diào)整,下面這篇文章主要給大家介紹了關(guān)于Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下
    2022-12-12
  • 一文詳解C++中的引用與關(guān)鍵字auto

    一文詳解C++中的引用與關(guān)鍵字auto

    引用就是給一個(gè)已經(jīng)存在的變量取一個(gè)別名,與變量共用一段內(nèi)存空間。關(guān)鍵字auto一般可以用來(lái)自動(dòng)識(shí)別類型,本文主要來(lái)講講二者的相關(guān)知識(shí),需要的可以參考一下
    2023-04-04
  • C++全密碼生成的實(shí)現(xiàn)代碼

    C++全密碼生成的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++全密碼生成的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例

    C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例

    本文主要介紹了C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • C語(yǔ)言實(shí)現(xiàn)掃雷程序

    C語(yǔ)言實(shí)現(xiàn)掃雷程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++淺析類與對(duì)象的基礎(chǔ)

    C++淺析類與對(duì)象的基礎(chǔ)

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • C++位運(yùn)算符詳解(異或運(yùn)算符和移位運(yùn)算符)

    C++位運(yùn)算符詳解(異或運(yùn)算符和移位運(yùn)算符)

    下面小編就為大家?guī)?lái)一篇C++位運(yùn)算符詳解(異或運(yùn)算符和移位運(yùn)算符)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • C語(yǔ)言輸出任意邊長(zhǎng)的菱形

    C語(yǔ)言輸出任意邊長(zhǎng)的菱形

    大家好,本篇文章主要講的是C語(yǔ)言輸出任意邊長(zhǎng)的菱形,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    楊輝三角是中國(guó)古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來(lái),是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試
    2022-01-01
  • 深入理解雙指針的兩種用法

    深入理解雙指針的兩種用法

    本篇文章是對(duì)雙指針的兩種用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

嘉义县| 苏州市| 德州市| 凌海市| 谷城县| 雷山县| 岢岚县| 宝丰县| 原平市| 渝中区| 会昌县| 南投市| 乌海市| 兴文县| 彰化县| 上栗县| 湄潭县| 娱乐| 益阳市| 彭阳县| 登封市| 横峰县| 桐梓县| 崇礼县| 华坪县| 尖扎县| 南郑县| 和政县| 姚安县| 叙永县| 当阳市| 东乌珠穆沁旗| 沧州市| 门头沟区| 亚东县| 什邡市| 肇源县| 清镇市| 资兴市| 德格县| 太仆寺旗|