首页 > 其他分享 >leetcode.21 合并两个有序链表

leetcode.21 合并两个有序链表

时间:2024-03-14 17:59:22浏览次数:29  
标签:curr list1 next 链表 有序 leetcode.21 list2 节点

 

21. 合并两个有序链表 

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

 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

 

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

 

 

文章目录

 

思路

参考:

解题方法
为了更方便的进行合并,有必要创建一个伪节点/哨兵节点( dummy = curr = ListNode()),以哨兵节点开始进行双链表的合并。哨兵节点 (dummy)实际上一个常见的链表处理技巧。创建一个哨兵(或称哑节点)节点 dummy,使得链表操作更加简化,因为我们不需要单独处理空链表的情况。此节点不存储任何实际数据,但其 next 指针会指向合并后链表的头节点;
当某一个链表遍历完,则可以终止迭代,并将另一个链表直接加在合并过的链表后面;
清楚在迭代中链表合并过程里的coding细节,比如:节点通过指针实现合并(curr.next = list1),节点通过指针实现移动(list2 = list2.next);
链表的操作均通过节点实现,list1和list2作为节点均可以移动。

 

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:

        dummy = curr = ListNode() # 构建哨兵节点,方便链表合并

        while list1 and list2: # 当list1或list2有一个遍历完则停止
            
            if list1.val < list2.val: # 合并list1节点
                curr.next, list1 = list1, list1.next # 比下面的写法更简练
            else:   # 合并list2节点
                curr.next = list2 # 合并节点
                list2 = list2.next # 移动节点
            curr = curr.next # 移动curr节点

        curr.next = list1 if list1 else list2
                
        return dummy.next # 返回哨兵节点后的链表,即为合并链表

 

 

 

 

标签:curr,list1,next,链表,有序,leetcode.21,list2,节点
From: https://www.cnblogs.com/chenxiaomeng/p/18073595

相关文章

  • 数据结构——循环链表,双向链表,线性表和有序表的合并详解
    目录1.循环链表1.带尾指针循环链表的合并 代码示例:2.双向链表代码示例:  1.双向链表的插入​代码示例:2.双向链表的删除代码示例:3.单链表,循环链表,双向链表时间效率的比较4.顺序表和链表的比较 5.存储密度6.线性表的应用 1.线性表的合并​代码示例:2.有序表......
  • leetcode141.环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • volatile关键字是如何确保多线程环境下变量的可见性和有序性
    VOLATILE关键字在JAVA中用于确保多线程环境下的变量可见性和一定程度的有序性,其具体实现机制基于JAVA内存模型(JAVAMEMORYMODEL,JMM):可见性:当一个线程修改了标记为volatile的共享变量时,它会强制将这个变量值从当前线程的工作内存刷新回主内存。同时,其他线程在读取该volatil......
  • 循环双向链表,精简代码秒懂!(C语言)
    #include<stdio.h>#include<stdlib.h>typedefintE;/***循环双链表*初始化*插入元素*删除元素*求链表总长*@return*/structArrayNode{Ee;structArrayNode*prev;structArrayNode*next;};typedefstructArrayNode*......
  • L2-002 链表去重(25分)
    代码真的好烂啊。一个元素加入之前,修改集合中(va,vb)最后一个元素的下一个地址为当前元素的地址。然后我是把(元素地址,下一个地址)和(元素的值)拆开放到两个集合了,放一个里面有点麻烦不太会处理。#include<bits/stdc++.h>usingnamespacestd;intvis[10010];//是否已经来过ve......
  • 链表中的经典问题——移除链表元素I
    移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。 题解一,迭代法:解题思路:    1.首先需要考虑,链表为空或head节点的值等于val的情况,这里可以引入一个虚拟的哑节点dummy_node,该......
  • leetcode 24.两两交换链表中的节点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]提......
  • 88. 合并两个有序数组c
    还有什么比刷简单题更爽的。intcmp(constvoid*a,constvoid*b){return*(int*)a-*(int*)b;}voidmerge(int*nums1,intnums1Size,intm,int*nums2,intnums2Size,intn){for(inti=m;i<nums1Size;i++){nums1[i]=nums2[i-m];}qsort(......
  • leetcode206. 反转链表
    一、链表(LinkedList)链表,是线性表的链式存储结构。一个链表中有若干个结点,每个结点都包含数据域和地址域两部分。数据域用于存储元素,地址域用于存储前驱或后继的地址。单链表:每个结点只有一个地址域的线性链表;双链表:每个结点都有两个地址域,分别指向前驱结点和后继结点。 ......
  • 【OJ】K 个一组翻转链表
    题目基本思路:用计数+栈实现分段,K个一组地翻转链表。#include<bits/stdc++.h>#include<stack>usingnamespacestd;structlist_node{intval;structlist_node*next;};list_node*input_list(){intval,n;scanf("%d",&n);list_node*phea......