連結串列面試題(七)---合併兩個有序連結串列
一、結構體的定義
typedef int DataType;
typedef struct ListNode//定義結點
{
DataType data;
struct ListNode* next;
}ListNode,*PListNode;
typedef struct PList//定義一個成員是指向結點的指標的結構體
{
PListNode PHead;
}PList,*PList;
二、函式實現
(1)合併兩個有序連結串列(非遞迴)
//7.合併兩個有序連結串列(非遞迴)
PListNode ConnectList(PList PList1,PList PList2)
{
PListNode cur1=NULL;//用於遍歷連結串列PList1
PListNode cur2=NULL;//用於遍歷連結串列PList2
PListNode NewHead=NULL;//指向新連結串列的第一個結點的指標(一旦確定就不動)
PListNode tail=NULL;//新連結串列的尾指標(每次連線一個新結點,更新一次)
assert(PList1&&PList2);
cur1=PList1->PHead;
cur2=PList2->PHead;
//1.如果兩個連結串列相等(即就是說合並一個連結串列),包括兩個連結串列都是空,返回任意一個
if (PList1->PHead==PList2->PHead)
{
return PList1->PHead;
}
//2.如果兩個連結串列不相等,且一個為空,返回不為空的連結串列的頭指標;
if (PList1->PHead==NULL)
{
return PList2->PHead;
}
if (PList2->PHead==NULL)
{
return PList1->PHead;
}
//3.確定新連結串列的頭結點
//如果連結串列1的頭結點的值小於連結串列2,新連結串列的頭指向連結串列1的第一個結點,尾結點也是第一個結點
//然後更新當前結點;
if (cur1->data<cur2->data)
{
NewHead=cur1;
tail=cur1;
cur1=cur1->next;
}
else
{
NewHead=cur2;
tail=cur2;
cur2=cur2->next;
}
//4.開始比較並且連線
while (cur1&&cur2)//當兩個連結串列同時沒有走完時,進去連線
{
if (cur1->data<cur2->data)
{
tail->next=cur1;//給心連結串列尾部連線結點
tail=tail->next;//更新新連結串列的尾部
cur1=cur1->next;//更新當前結點的為下一個結點
}
else
{
tail->next=cur2;
tail=tail->next;
cur2=cur2->next;
}
}
//5.等到有一個連線完畢,迴圈出來
//當一個連結串列全部元素連線完畢,那麼將另一個連結串列剩下的元素的頭連線到新元素的尾
if (cur1==NULL)
tail->next=cur2;
else
tail->next=cur1;
return NewHead;
}
(2)合併兩個連結串列(遞迴)
//7.1合併兩個連結串列(遞迴)
PListNode ConnectList1(PListNode PHead1,PListNode PHead2)
{
PListNode cur1=NULL;
PListNode cur2=NULL;
PListNode NewNode=NULL;
cur1=PHead1;
cur2=PHead2;
//1.特殊情況處理
if (PHead1==PHead2)//兩個要合併的連結串列相同(包括兩個連結串列都為空),任意返回一個
{
return PHead1;
}
//只有一個連結串列空,返回指向不為空的連結串列的第一個結點的指標
if (PHead1==NULL)
{
return PHead2;
}
if (PHead2==NULL)
{
return PHead1;
}
//2.確定新連結串列的
if (cur1->data < cur2->data)
{
NewNode=cur1;
cur1=cur1->next;
NewNode->next=ConnectList1(cur1,cur2);
}
else
{
NewNode = cur2;
cur2=cur2->next;
NewNode->next=ConnectList1(cur1,cur2);
}
return NewNode;
}
相關文章
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- Leetcode 21 合併兩個有序連結串列 學習感悟LeetCode
- 23. 合併K個元素的有序連結串列
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 合併K個排序連結串列排序
- 02-線性結構1 兩個有序連結串列序列的合併 (15分)
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 反轉連結串列、合併連結串列、樹的子結構
- 連結串列面試題(十二)---判斷兩個都不帶環的連結串列是否相交面試題
- 讓我們一起啃演算法----合併兩個有序連結串列演算法
- Fourth. LeetCode 21:MergeTwo Sorted Lists 合併兩個有序連結串列LeetCode
- 連結串列專題——面試中常見的連結串列問題面試
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- [LeetCode] Merge k Sorted Lists 合併k個有序連結串列LeetCode
- 有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...排序
- 前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列前端演算法
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- JZ-016-合併兩個排序的連結串列排序
- (連結串列)連結串列的排序問題排序
- 測試開發每日演算法 Leecode21. 合併兩個有序連結串列演算法
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題