力扣HOT100(27) 合并两个有序链表

迭代法:

两个链表都是升序的,所以每次只需要比较两个链表当前的头节点,把值更小的那个节点接在新链表的后面,然后把对应的链表指针往前走一步。重复这个过程,直到其中一个链表走完,最后把剩下的那个链表直接接在新链表的末尾即可。

想象有两个队伍,都是按身高从矮到高排好的:

  • 队伍 1:1 号(1 米)→ 2 号(1.2 米)→ 4 号(1.4 米)
  • 队伍 2:1 号(1 米)→ 3 号(1.3 米)→ 4 号(1.4 米)

现在要把这两个队伍合并成一个新队伍,还是从矮到高排。

**每次只看两个队伍的第一个人,把更矮的那个拉到新队伍里,然后这个队伍的下一个人变成第一个。**重复这个过程,直到其中一个队伍没人了,最后把剩下的那个队伍整个拉到新队伍后面就行。

代码中需要注意的是:要先创建一个虚拟的链表头,为了让链表有个头,然后还需要有个tail指针 始终指向链表的最后一个节点。开始指向的是这个虚拟的链表头。然后把节点存到新指针的时候呢,就是tail->的下个节点 等于 我们要存的即可。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* p1 = list1;
        ListNode* p2 = list2;

        // ========= 你缺的 =========
        ListNode* dummy = new ListNode(-1); // 虚拟头。new ListNode创建新节点
        ListNode* tail = dummy;             // 尾巴指针,开始指向虚拟头

        while(p1!=nullptr && p2!= nullptr){

            if(p1->val <= p2->val ){  // 如果p1不大于p2
                // === 存 p1 ===
                tail->next = p1; //当前最后一节点的下一个存入我们的新节点
                p1 = p1->next;
            }
            else{
                // === 存 p2 ===
                tail->next = p2;
                p2 = p2->next;
            }
            tail = tail->next; // 尾巴必须走! 因为必须指向最后一个节点。
        }

        // === 把剩下的直接接上 ===
        if(p1 == nullptr){
            tail->next = p2;
        }
        else{
            tail->next = p1;
        }

        return dummy->next; // 返回真正头
    }
};
相关推荐
h_a_o777oah13 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO913 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician13 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.13 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
程序员清风15 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
Logic10118 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
殷色玫瑰19 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
写后端的胖头鱼21 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘21 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包21 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表