連結串列面試題(七)---合併兩個有序連結串列
一、結構體的定義
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
- 遞迴:21. 合併兩個有序連結串列遞迴
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- Leetcode 21 合併兩個有序連結串列 學習感悟LeetCode
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- 7-24 兩個有序連結串列序列的合併 (20 分)
- 7-2 兩個有序連結串列序列的合併 (20分)
- Fourth. LeetCode 21:MergeTwo Sorted Lists 合併兩個有序連結串列LeetCode
- 兩個有序連結串列序列的交集
- 23. 合併K個元素的有序連結串列
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 連結串列專題——面試中常見的連結串列問題面試
- 測試開發每日演算法 Leecode21. 合併兩個有序連結串列演算法
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 合併K個排序連結串列排序
- 02-線性結構1 兩個有序連結串列序列的合併 (15分)
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 反轉連結串列、合併連結串列、樹的子結構
- JZ-016-合併兩個排序的連結串列排序
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- 讓我們一起啃演算法----合併兩個有序連結串列演算法
- 將兩個升序連結串列合併為一個新的 升序 連結串列並返回。(新手篇06)
- 2024/12/1 【連結串列】 LeetCode 面試題 02.07. 連結串列相交LeetCode面試題
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列前端演算法
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- LeetCode 之 JavaScript 解答第23題 —— 合併K個有序連結串列(Merge K Sorted Lists)LeetCodeJavaScript
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- leecode.23. 合併K個升序連結串列
- 一個node連結串列翻轉的面試題面試題
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題