兩個鏈表第一個公共結點

来源:http://www.cnblogs.com/sankexin/archive/2016/07/01/5634372.html
-Advertisement-
Play Games

題目:輸入兩個鏈表,找出它們的第一個公共節點。鏈表的定義如下: 思路1:採用蠻力的方法:在第一個鏈表上順序遍歷每個節點,每遍歷到一個節點的時候,在第二個鏈表上順序遍歷每個節點。如果第二個鏈表上的節點和第一個鏈表上的節點一樣,就說明兩個鏈表在節點上重合,於是就找到了公共的節點。而通常蠻力並不是好的方法 ...


題目:輸入兩個鏈表,找出它們的第一個公共節點。鏈表的定義如下:

struct ListNode

{

int m_nValue;

ListNode *m_pNext;



};

思路1:採用蠻力的方法:在第一個鏈表上順序遍歷每個節點,每遍歷到一個節點的時候,在第二個鏈表上順序遍歷每個節點。如果第二個鏈表上的節點和第一個鏈表上的節點一樣,就說明兩個鏈表在節點上重合,於是就找到了公共的節點。而通常蠻力並不是好的方法。

思路2:首先遍歷兩個鏈表得到它們的長度,就能知道哪個鏈表比較長,以及長的鏈表比短的鏈表多幾個節點。在第二次遍歷的時候,先在較長的節點上走若幹步,接著同時在兩個鏈表上遍歷,找到的第一個相同的節點就是它們的公共的節點。

  1 #include "stdafx.h"
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 struct ListNode
  5  {
  6      int             m_nValue;
  7      ListNode*       m_pNext;
  8  };
  9 
 10  ListNode* CreateListNode(int value)
 11  {
 12      ListNode* pNode = new ListNode();
 13      pNode->m_nValue = value;
 14      pNode->m_pNext = NULL;
 15 
 16      return pNode;
 17  }
 18 
 19  void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
 20  {
 21      if(pCurrent == NULL)
 22      {
 23          printf("Error to connect two nodes.\n");
 24          exit(1);
 25      }
 26 
 27      pCurrent->m_pNext = pNext;
 28  }
 29 
 30  void PrintListNode(ListNode* pNode)
 31  {
 32      if(pNode == NULL)
 33      {
 34          printf("The node is NULL\n");
 35      }
 36      else
 37      {
 38          printf("The key in node is %d.\n", pNode->m_nValue);
 39      }
 40  }
 41 
 42  void PrintList(ListNode* pHead)
 43  {
 44      printf("PrintList starts.\n");
 45 
 46      ListNode* pNode = pHead;
 47      while(pNode != NULL)
 48      {
 49          printf("%d\t", pNode->m_nValue);
 50          pNode = pNode->m_pNext;
 51      }
 52 
 53      printf("\nPrintList end.\n");
 54  }
 55 
 56 void DestroyList(ListNode* pHead)
 57 {
 58     ListNode* pNode = pHead;
 59     while(pNode != NULL)
 60     {
 61         pHead = pHead->m_pNext;
 62         delete pNode;
 63         pNode = pHead;
 64     }
 65 }
 66 
 67 unsigned int GetListLength(ListNode* pHead);
 68 
 69 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)
 70 {
 71     // 得到兩個鏈表的長度
 72     unsigned int nLength1 = GetListLength(pHead1);
 73     unsigned int nLength2 = GetListLength(pHead2);
 74     int nLengthDif = nLength1 - nLength2;
 75  
 76     ListNode* pListHeadLong = pHead1;
 77     ListNode* pListHeadShort = pHead2;
 78     if(nLength2 > nLength1)
 79     {
 80         pListHeadLong = pHead2;
 81         pListHeadShort = pHead1;
 82         nLengthDif = nLength2 - nLength1;
 83     }
 84  
 85     // 先在長鏈表上走幾步,再同時在兩個鏈表上遍歷
 86     for(int i = 0; i < nLengthDif; ++ i)
 87         pListHeadLong = pListHeadLong->m_pNext;
 88  
 89     while((pListHeadLong != NULL) && 
 90         (pListHeadShort != NULL) &&
 91         (pListHeadLong != pListHeadShort))
 92     {
 93         pListHeadLong = pListHeadLong->m_pNext;
 94         pListHeadShort = pListHeadShort->m_pNext;
 95     }
 96  
 97     // 得到第一個公共結點
 98     ListNode* pFisrtCommonNode = pListHeadLong;
 99  
100     return pFisrtCommonNode;
101 }
102 
103 unsigned int GetListLength(ListNode* pHead)
104 {
105     unsigned int nLength = 0;
106     ListNode* pNode = pHead;
107     while(pNode != NULL)
108     {
109         ++ nLength;
110         pNode = pNode->m_pNext;
111     }
112  
113     return nLength;
114 }
115 
116 // 第一個公共結點在鏈表中間
117 // 1 - 2 - 3 \
118 //            6 - 7
119 //     4 - 5 /
120 int main()
121 {
122     ListNode* pNode1 = CreateListNode(1);
123     ListNode* pNode2 = CreateListNode(2);
124     ListNode* pNode3 = CreateListNode(3);
125     ListNode* pNode4 = CreateListNode(4);
126     ListNode* pNode5 = CreateListNode(5);
127     ListNode* pNode6 = CreateListNode(6);
128     ListNode* pNode7 = CreateListNode(7);
129 
130     ConnectListNodes(pNode1, pNode2);
131     ConnectListNodes(pNode2, pNode3);
132     ConnectListNodes(pNode3, pNode6);
133     ConnectListNodes(pNode4, pNode5);
134     ConnectListNodes(pNode5, pNode6);
135     ConnectListNodes(pNode6, pNode7);
136 
137     ListNode* pResult = FindFirstCommonNode(pNode1, pNode4);
138     printf("%d\n",pResult->m_nValue);
139     
140     DestroyNode(pNode1);
141     DestroyNode(pNode2);
142     DestroyNode(pNode3);
143     DestroyNode(pNode4);
144     DestroyNode(pNode5);
145     DestroyNode(pNode6);
146     DestroyNode(pNode7);
147         
148     return 0;
149 }


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python類及其方法 一、介紹 在 Python 中,面向對象編程主要有兩個主題,就是類和類實例類與實例:類與實例相互關聯著:類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象的具體信息。 類有這樣一些的優點: 二、類的定義 1.定義類(class)的語法 一第行,語法是class ...
  • ArrayList簡介 ArrayList是基於數組實現的,是一個動態數組,其容量能自動增長,類似於C語言中的動態申請記憶體,動態增長記憶體。 ArrayList不是線程安全的,只能用在單線程環境下,多線程環境下可以考慮用Collections.synchronizedList(List l)函數返回一 ...
  • 1、搭建定時任務quartz 本來是打算把定時任務放入後臺管理中,這樣目前沒問題,但是弱後期加入許可權管理-shiro,那麼肯定有衝突的,原因是最新版的shiro會使用quartz-1.6版本,而最新的quartz已經到了2.3 有人索性把quartz版本降到了1.6,這樣就沒問題,我想這樣不好,2. ...
  • 從c++轉到java,初學struts,竟然碰到一個因寫錯單詞而造成的錯誤,structs --> struts ...
  • 這是個對於讀寫鎖中級剖析文章, 會自己實現讀寫鎖的細節.歡迎用到自己的項目中. ...
  • 在 HttpRequest 對象中,屬性 GET 和 POST 得到的都是 django.http.QueryDict 所創建的實例。這是一個 django 自定義的類似字典的類,用來處理同一個鍵帶多個值的情況。 在 python 原始的字典中,當一個鍵出現多個值的時候會發生衝突,只保留最後一個值。 ...
  • 一、過濾器 過濾器就是向web應用程式的請求和和響應添加功能的組件。過濾器能夠實現客戶端和目標資源之間的交互信息進行篩選和過濾,最終保留有效的數據信息。 二、過濾器的生命周期 2.1 實例化。 web容器複製創建過濾器的實例來完成過濾器的實例化,只會實例化一次。 2.2 初始化。 在進行過濾工作前會 ...
  • 一、servlet的概念 Servlet是一種獨立與平臺和協議的伺服器端java應用程式,通過Servlet可以生成動態web頁面,同時使用Servlet還可以在伺服器端對客戶的請求進行處理,控製程序的執行。 Servlet的主要作用就是互動式的瀏覽和更新數據,並生成動態的頁面內容展示。 1. 服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...