力扣 题目21-- 合并两个有序链表
题目
题解
1.迭代法
一开始都在头结点 由于1和1相等 我们取任意一个 然后把节点向右移动
我取了上面的1所以上面向右移动 此时 1
1与2比较 1小所以取1 然后下面向右移动 此时1->1
同理2与3比较 2小取2 此时1->1->2
....
当一个链表已经被取完时 直接取另一个链表即可 都取完就退出循环
2.递归法
规则1 当一个链表没有值时直接返回另一个链表
规则2 判断每轮的头结点 让头结点小的链表->next 然后与另一个链表重新放入函数中 然后再返回小的那个头结点
代码
迭代
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct ListNode { 5 int val; 6 ListNode* next; 7 ListNode() : val(0), next(nullptr) {} 8 ListNode(int x) : val(x), next(nullptr) {} 9 ListNode(int x, ListNode* next) : val(x), next(next) {} 10 }; 11 12 class Solution { 13 public: 14 ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { 15 ListNode* headlist = new ListNode(); 16 ListNode* head = headlist; 17 if (list1 == NULL) { 18 return list2; 19 } 20 else if (list2 == NULL) { 21 return list1; 22 } 23 else if (list1->val >= list2->val) { 24 headlist->val = list2->val; 25 list2 = list2->next; 26 } 27 else if (list1->val < list2->val) { 28 headlist->val = list1->val; 29 list1 = list1->next; 30 } 31 while (true) { 32 if (list1 == NULL && list2 == NULL) { 33 break; 34 } 35 else if (list1 == NULL) { 36 headlist->next = list2; 37 list2 = list2->next; 38 } 39 else if (list2 == NULL) { 40 headlist->next = list1; 41 list1 = list1->next; 42 } 43 else if (list1->val >= list2->val) { 44 45 headlist->next = list2; 46 list2 = list2->next; 47 } 48 else if (list1->val < list2->val) { 49 headlist->next = list1; 50 list1 = list1->next; 51 } 52 headlist = headlist->next; 53 } 54 headlist->next = NULL; 55 return head; 56 } 57 }; 58 void listnum(ListNode& list, vector<int>& vectorlist) { 59 ListNode* headlist = &list; 60 for (int i = 0; i < vectorlist.size(); i++) { 61 ListNode* p; 62 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 63 p->val = vectorlist[i]; 64 headlist->next = p; 65 headlist = headlist->next; 66 } 67 headlist->next = NULL; 68 } 69 int main() { 70 Solution sol; 71 ListNode list1(1); 72 vector<int> vectorlist1 = { 2,4 }; 73 listnum(list1, vectorlist1); 74 ListNode list2(1); 75 vector<int> vectorlist2 = { 3,4 }; 76 listnum(list2, vectorlist2); 77 ListNode* head = sol.mergeTwoLists(&list1, &list2); 78 79 }
递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct ListNode { 5 int val; 6 ListNode *next; 7 ListNode() : val(0), next(nullptr) {} 8 ListNode(int x) : val(x), next(nullptr) {} 9 ListNode(int x, ListNode *next) : val(x), next(next) {} 10 }; 11 12 class Solution { 13 public: 14 ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { 15 if (list1 == NULL) { 16 return list2; 17 } 18 else if (list2 == NULL) { 19 return list1; 20 } 21 else if (list1->val >= list2->val) { 22 list2->next = mergeTwoLists(list1, list2->next); 23 return list2; 24 } 25 else if (list1->val < list2->val) { 26 list1->next = mergeTwoLists(list1->next, list2); 27 return list1; 28 } 29 return list1; 30 } 31 }; 32 void listnum(ListNode &list, vector<int> &vectorlist) { 33 ListNode* headlist = &list; 34 for (int i = 0; i < vectorlist.size(); i++) { 35 ListNode* p; 36 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 37 p->val = vectorlist[i]; 38 headlist->next = p; 39 headlist = headlist->next; 40 } 41 headlist->next = NULL; 42 } 43 int main() { 44 Solution sol; 45 ListNode list1(1); 46 vector<int> vectorlist1 = { 2,4 }; 47 listnum(list1, vectorlist1); 48 ListNode list2(1); 49 vector<int> vectorlist2 = { 3,4 }; 50 listnum(list2, vectorlist2); 51 ListNode *head=sol.mergeTwoLists(&list1, &list2); 52 53 }