当前位置: 代码迷 >> 综合 >> Leetcode 21 合并两个有序链表 学习感悟
  详细解决方案

Leetcode 21 合并两个有序链表 学习感悟

热度:46   发布时间:2024-02-25 14:48:11.0

思路:

迭代一个个往里面加

# 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;
}