c++中合并兩個(gè)有序鏈表的方法-創(chuàng)新互聯(lián)

c++中合并兩個(gè)有序鏈表的方法?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

在興賓等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設(shè)公司,興賓網(wǎng)站建設(shè)費(fèi)用合理。

1.題目要求

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

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

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

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

算法過程:
 輸入:兩個(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);
}

分享文章:c++中合并兩個(gè)有序鏈表的方法-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://www.muchs.cn/article28/dhoicp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)