LeetCode 21. 合并两个有序链表

地址 https://leetcode-cn.com/problems/merge-two-sorted-lists/

目描述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

样例
示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

 

算法1
重点在于不使用额外空间
那么就逐个比较两个链表当前值
1 如果链表1节点值小于链表2节点值 就保留该值 链表1当前检查索引指向下一个链表节点
2 如果链表1节点值大于链表2节点值 交换两链表值后,链表1当前检查索引指向下一个链表节点。同时要保证链表2的升序

复制代码
 1 class Solution {
 2 public:
 3 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4     ListNode* head1 = l1;
 5     ListNode* head2 = l2;
 6     while (l1 != NULL && l2 != NULL) {
 7         if (l1->val > l2->val) {
 8             swap(l1->val, l2->val);
 9             while (l2 != NULL && l2->next != NULL && l2->val > l2->next->val) {
10                 swap(l2->val, l2->next->val);
11                 l2 = l2->next;
12             }
13             l2 = head2;
14             if (l1->next != NULL)
15                 l1 = l1->next;
16             else
17                 break;
18         }
19         else {
20             if (l1->next != NULL)
21                 l1 = l1->next;
22             else
23                 break;
24         }
25     }
26     if(l1 != NULL){
27         while (l1->next != NULL) {
28             l1 = l1->next;
29         }
30         l1->next = head2;
31     }
32     else {
33         return head2;
34     }
35 
36     return head1;
37 }
38 
39 };
复制代码

算法2
投机取巧办法 转化成数组后 再转回链表

C++ 代码

复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
12         if(l1==NULL) return l2;
13         if(l2 == NULL) return l1;
14         vector<int> v;
15         ListNode* p = l1;
16         while(p!=NULL){
17             v.push_back(p->val);
18             p = p->next;
19         }   
20         p = l2;
21         while(p!=NULL){
22             v.push_back(p->val);
23             p = p->next;
24         } 
25         sort(v.begin(),v.end());
26         p =l1; int idx = 0;
27         while(p != NULL){
28             p->val = v[idx];
29             idx++;
30             if(p->next == NULL) break;
31             p=p->next;
32         }
33         if(p != NULL)
34             p->next = l2;
35         p =l2;
36         while(p != NULL){
37             p->val = v[idx];
38             idx++;
39             if(p->next == NULL) break;
40             p=p->next;
41         }
42 
43         return l1;
44     }
45 };
复制代码

 

posted on   itdef  阅读(192)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2019-05-01 前缀和的一个应用

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示