Leetcode 21 合併兩個有序連結串列 學習感悟
思路:
迭代一個個往裡面加
# include<iostream>
# include<vector>
# include<string>
# include<algorithm>
# include<math.h>
# include<climits>
# include<stack>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = NULL;
ListNode* p=head;
ListNode* lp1 = l1;
ListNode* lp2 = l2;
while (lp1 || lp2) {//只要有一個節點存在
if (lp1 && lp2) {
if (lp1->val < lp2->val) {//lp1數字小
l1 = lp1->next;
if (!head) {//head開始為空
lp1->next = NULL;//斷尾
head = lp1;
lp1 = l1;
p = head;
}
else {//head 已經不為空了
p->next = lp1;
p = lp1;
lp1 = l1;
p->next = NULL;
}
}
else {//lp2數字小
l2 = lp2->next;
if (!head) {//head開始為空
lp2->next = NULL;//斷尾
head = lp2;
lp2 = l2;
p = head;
}
else {//head 已經不為空了
p->next = lp2;
p = lp2;
lp2 = l2;
p->next = NULL;
}
}
}
else if (!lp1) {//lp1不存在
if (!head) {//頭不存在
head = l2;
l2 = l2->next;
p = head;
}
while (l2) {
p->next = l2;
p = p->next;
l2 = l2->next;
}
lp2 = NULL;
p->next = NULL;
}
else if (!lp2) {//lp2不存在
if (!head) {//頭不存在
head = l1;
l1 = l1->next;
p = head;
}
while (l1) {
p->next = l1;
p = p->next;
l1 = l1->next;
}
lp1 = NULL;
p->next = NULL;
}
else { ; }//不可能出現
}
return head;
}
int main(void) {
ListNode* l1=new ListNode(1, new ListNode(2, new ListNode(4)));
ListNode* l2=new ListNode(1, new ListNode(3, new ListNode(4)));;
ListNode* head = mergeTwoLists(l1, l2);
system("pause");
return 0;
}
優化:
注意:l1,l2 在mergeTwoLists函式中是拷貝,所以在函式中將l1 , l2 資訊丟失並不會影響原先的l1,l2 的連結串列資料
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1);
ListNode* p=head;
while (l1 && l2) {
if (l1->val < l2->val) {//l1小
p->next = l1;
l1 = l1->next;
}
else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
if (l1)
p->next = l1;
if (l2)
p->next = l2;
p = head;
head = head->next;
delete(p);
return head;
}
相關文章
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- Fourth. LeetCode 21:MergeTwo Sorted Lists 合併兩個有序連結串列LeetCode
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- 測試開發每日演算法 Leecode21. 合併兩個有序連結串列演算法
- [LeetCode] Merge k Sorted Lists 合併k個有序連結串列LeetCode
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- 23. 合併K個元素的有序連結串列
- 02-線性結構1 兩個有序連結串列序列的合併 (15分)
- 讓我們一起啃演算法----合併兩個有序連結串列演算法
- leetcode23. 合併K個排序連結串列LeetCode排序
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- 【LeetCode】88. 合併兩個有序陣列LeetCode陣列
- 有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...排序
- 合併K個排序連結串列排序
- 合併兩個有序陣列陣列
- LeetCode 之 JavaScript 解答第23題 —— 合併K個有序連結串列(Merge K Sorted Lists)LeetCodeJavaScript
- 前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列前端演算法
- JZ-016-合併兩個排序的連結串列排序
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 88、合併兩個有序陣列陣列
- LeetCode合併兩個有序陣列(逆向雙指標)LeetCode陣列指標
- 88. 合併兩個有序陣列陣列
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 每日一道 LeetCode (19):合併兩個有序陣列LeetCode陣列
- LeetCode每日一題:合併兩個有序陣列(No.88)LeetCode每日一題陣列
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- 兩個有序陣列如何合併成一個有序陣列陣列
- 將兩個有序陣列合併為一個有序陣列陣列
- 實戰資料結構(3)_兩個單連結串列間的合併操作資料結構
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 【leetcode 簡單】第二十題 合併兩個有序陣列LeetCode陣列
- 反轉連結串列、合併連結串列、樹的子結構
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- leecode.23. 合併K個升序連結串列
- 18.合併兩個有序陣列(簡單)陣列