首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏个人技术笔记

    合并有序链表

    以此类推,等递归到最后一层的时候,每次返回必然会自然而然的承接上自己的头结点,递归结束后的new_list便指向新链表的头结点的地址。 不用递归的话要先手判断,两个链表的头结点的值,取其中小的,用两个变量进行存储。为什么要两个,因为一个用于循环是一层层往下面加节点,一个用于返回,不然你循环完了,却又给不出头结点,那不就废了嘛。         }         ListNode test1 = l1;         ListNode test2 = l2;         System.out.println("第一个链表             System.out.println(end.val);             end = end.next;         }     }     /**      * 使用递归的方式进行合并两个列表 new_list.next = mergeTwoLists2(l1, l2.next);         }         return new_list;     }     /**      * 使用循环的方式进行合并两个列表

    34320编辑于 2022-10-30
  • 来自专栏绝活编程学习

    合并连个有序链表(递归)

    合并两个有序链表 - 力扣(LeetCode) 2.讲解算法原理 2.1重复子问题 2.2只关心其中的一个子问题是如何解决的 2.3细节,递归出口 3.代码编写 4.小总结 (循环(迭代

    15700编辑于 2024-12-16
  • 来自专栏面试经验贴

    4 合并有序链表

    本文涉及知识点  哨兵结点的运用 链表数据结构中哨兵的作用在之前详细阐述了[leetcode链表系列]2 删除链表中的节点,忘记了的小伙伴复习后再看效果一定翻倍哟! 1 Leetcode21 合并有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 01 题目解析 思路 为了方便返回合并后的链表,我们使用head为头结点,p1,p2分别跟踪两链表L1,L2.如下图。 ? 如果p1当前值小于p2的值,我们就将p1的值直接连接在pre后面并移动p1。 循环结束的时候,如果有一个链表非空,因为两链表有序,将其合并到另个链表即可。 今天小蓝没有把具体完整的画出来,想着做了一个带bgm的动画,大家可以放松放松的看看。

    54820发布于 2020-06-05
  • 来自专栏软件工程

    合并K个有序链表

    题目:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路: 把每个链表得头放进小根堆里,这样每次取得都是全部链表得最小值 如下图,每次取出来一个值,链表向上移动 代码: public ListNode mergeKLists(ListNode[] lists) { if (lists==null||lists.length ==0){ return null; } //造个小根堆,以链表头结点得值排序得小根堆 PriorityQueue<ListNode

    59420编辑于 2021-12-22
  • 来自专栏灰子学技术

    算法篇:链表合并有序链表

    算法: 算法的核心在于两个有序链表合并操作,K个有序链表合并只是一个变形题目,先拆分成k/2个有序链表,然后等比数列减少到1个数列。 题目1:合并两个有序链表 https://leetcode-cn.com/problems/merge-two-sorted-lists/ ? ‘题目2: 合并k个排序链表 https://leetcode-cn.com/problems/merge-k-sorted-lists/ ?

    58120发布于 2020-08-03
  • 来自专栏学习

    链表篇》---合并两个有序链表

    2.同时遍历两个链表的值。若链表1的值小于链表2。则新节点链接链表1。并链表1往后走一位。反之链接链表2。链表2往后走一位。最后创建的新的链表节点也往后走一位。 3.在链表1和链表2都不为空的情况下。重复2的步骤。直到某一个链表遍历完毕。 4.最后拼接尚未遍历完的链表。 5.返回新建链表。 list2 = list2.next; } prev = prev.next; } // 连接剩余的链表

    26100编辑于 2025-05-31
  • 来自专栏前端小码农

    合并两个有序链表

    JavaScript实现LeetCode第21题:合并两个有序链表 题目描述 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路分析 新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素 ,则直接另一个未完成的链表直接链入新链表的末尾。

    2.4K30发布于 2020-07-16
  • 来自专栏程序员

    合并两个有序链表

    合并两个有序链表,使得合并后的结果仍然是有序的,直观的做法就是从两个链表的首节点开始比较,将其中小的那个链接到新链表之中,(如果不想破坏原链表,那么需要将该节点拷贝一份,然后链接到新链表之中。) void Print(List L); //遍历链表 List Merge(List L1, List L2); //合并链表 int main() { List L1, L2, L; / /构造L1和L2链表 L1 = Read(); L2 = Read(); //合并L1和L2链表 L = Merge(L1, L2); //合并后的结果 Print(L); printf( } } if (NULL == p1) { p3->Next = p2; } if (NULL == p2) { p3->Next = p1; } //此处在原节点的基础上合并两个链表 ,破坏掉了原链表,使得原链表为空 L1->Next = NULL; L2->Next = NULL; //返回新链表的头指针 return p; } 这种使用双指针的方法,不止在合并链表的时候会用到

    5.8K20发布于 2019-05-25
  • 来自专栏五分钟学算法

    合并两个有序链表

    题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 吴师兄的思路 当 l1 和 l2 都不为空时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果中,当一个节点被添加到结果中之后,将对应链表中的节点向后移一位,查看和对比下一个节点 具体操作如下: 1、由于需要对比两个链表的头节点,为了让两个原链表的头节点的地位与其它节点的地位一样,避免做其它额外的判断处理,这里设定一个虚拟头节点 dummy ,方便后续返回合并后的链表 2、维护一个 7、跳出循环后,l1 或者 l2 中可能有剩余的节点没有被观察过,直接把剩下的节点加入到 pre 的 next 指针位置就行,因为 l1 和 l2 都是有序的,所以不管哪个链表有剩余的节点没有被观察过, 它包含的所有元素都比前面已经合并链表中的所有元素都要大。

    1.9K80编辑于 2021-12-21
  • 来自专栏用户4456933的专栏

    合并两个有序链表

    合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 ? ,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。 由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。 这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可 /** * Definition for singly-linked list. l2 : l1 return listNode.next }; 解法二:递归 思路:如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表

    1.9K30发布于 2021-06-01
  • 来自专栏c++ 学习分享

    合并两个有序链表

    ,用于合并两个已排序的链表。 下面是对这段代码的解释: 创建一个哑节点(dummy)作为合并链表的头部,并创建一个指针 tail 指向 dummy,同时初始化为0。 ListNode* dummy = new ListNode(0); ListNode* tail = dummy; 使用 while 循环遍历两个输入链表 list1 和 list2,进行合并操作,直到其中一个链表为空 tail->next = list2; list2 = list2->next; } tail = tail->next; } 在循环结束后,将剩余的非空链表直接连接到合并链表的尾部 if (list1) { tail->next = list1; } if (list2) { tail->next = list2; } 最后,获取合并链表的头部节点,删除哑节点,返回合并后的链表

    73100编辑于 2024-05-24
  • 来自专栏C/C++基础

    合并两个有序链表

    已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。结果链表要包含head1和head2的所有节点,即使节点值相同。 注意:不能开辟新空间来存储合并后的链表。 如果第一次做该题,很容易会想到使用新链表来存储合并后的有序链表。虽然可以如此实现,但是不符合常规解法和面试官的要求。 2.非递归实现 算法过程: 输入:两个有序的单链表head1与head2; 输出:合并后的有序链表mergeHead; 算法描述: (1)如果head1或head2为空链表,则直接返回另外一个链表 7 8 ss1 strIn:3 4 5 6 7 8 合并链表: 1 2 3 3 4 5 5 6 7 8 3.递归实现 从上面合并两个有序链表的步骤中可以看出,每次合并的步骤(2)都是一样的,由此我们想到了递归 mergeOrderedLinkedListRecursion(head1,head2->next); } return mergeHead; } ---- 参考文献 [1]C++算法之 合并两个有序链表

    2.8K21发布于 2018-08-03
  • 来自专栏小小黑的游戏开发之路

    合并两个有序链表

    合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 [1,1,2,3,4,4] 输入:l1 = [], l2 = [] 输出:[] 输入:l1 = [], l2 = [0] 输出:[0] 思路 使用双指针思想解题 首先定义两个指针p1,p2分别指向两个有序链表的头结点 每一次循环都比较两个指针指向节点的值,将偏小的节点加到新链表中(若相等则将p2加到新链表中),且较小的链表上的指针往后移动一位。 当p1、p2任意next节点为空时,将非空节点加到新链表中。 7.同步骤4 循环执行,直到一方指针为空跳出循环 将非空指针指向的节点加到已排序的链表里,此时返回ptmp->next即为合并后的链表 代码 /** * Definition for singly-linked ->将原链表指针向后移动->将新链表指针向后移动 当循环结束后,把原链表非空指针指向的节点加到已排序的链表中即可,返回虚拟头结点的next节点,即可得到合并后的有序链表

    88520编辑于 2023-08-11
  • 来自专栏c++与qt学习

    合并两个有序链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: c++代码: 思路1:开辟一个新链表用来存放新的合并后的升序链表,每一次从l1和l2链表分别取出来一个节点,判断两个节点的值哪一个大,大的节点跟在小的节点后面,小的节点尾插到新链表后面 ,并且还有判断l1和l2哪个链表长度更长,当出现一个链表遍历完后,另一个链表剩余部分就直接尾插到新链表后面 #include<iostream> using namespace std; struct ListNode* newList = new ListNode();//该链表用来存放整合后的数据 ListNode* end = newList;//指向当前链表尾节点 << "请为l2链表赋值:" << endl; input(l2); cout << "输出l2链表: " << endl; display(l2); cout <<

    1.5K30编辑于 2022-05-05
  • 来自专栏渔夫

    算法-合并两个有序链表

    https://blog.csdn.net/li_xunhuan/article/details/90142458 题目: 将两个有序链表合并为一个新的有序链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的。 ,然后对于合并结果链表进行赋值,因为这违反了结点的本质:不连续的内存单元;多创建结点无疑在空间复杂度上不优。 要说唯一的缺点就是这里是把原来链表结构破坏了 ? 2.对于链表运算中加一个dummyHead可以进行把头节点作为普通结点一样来处理,不同于数组在开头多加一个元素会造成返回的数组多了一个元素,链表中结点的不连续性真的很好用 3.dummyHead的好处还在于单向链表中头节点一直都是已知的就是为

    1.4K20发布于 2019-07-31
  • 来自专栏阿飞的学习记录

    合并两个有序链表

    题目:输入两个递增排序的链表合并这两个链表并使新链表中的节点仍然是递增排序的。 这种链表 是需要我们遍历链表的 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 是否需要头结点 : 因为我们 目前的 头结点是不能确定的 当l1.val<l=2.val 时 头结点指向l1 当l1.val>l2.val 时 头结点指向l2 因此我们需要一个头结点指向 头结点的next 指向l1或l2 我们还需要判断边界条件 两个链表不一定一样长 有可能l1遍历完了 cur=cur.next; } //如果l1链表不为空 if(l1! =null){ //如果l2链表不为空剩余的加入到cur cur.next=l2; } return dump.next

    66610编辑于 2022-03-23
  • 来自专栏曌的晓痴

    LeetCode - 合并两个有序链表

    merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的。 首先判断链表l1和l2是否为空,如果有一个为空,那就直接返回另一个链表即可 然后就是不停的遍历链表l1和l2,分别判断两个链表当前节点的值大小,取值更小的节点,并将指向该链表的指针往后移动 如果在遍历时发现某一个链表已经为空了 ,那么最快的方式就是直接将链表的下一个指针指向另一个链表即可。

    49850发布于 2019-08-16
  • 来自专栏Jasper小笔记

    21 合并两个有序链表

    01 题目信息 题目地址: https://leetcode-cn.com/problems/merge-two-sorted-lists/ 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 02 解法一:迭代 两个链表两个指针不停的比较拼接新链表直到都遍历完成,每个迭代四个变动(三个指针以及cur cur.next = l2; l2 = l2.next; } cur = cur.next; } //处理最后的,另一个链表无论还剩多少个都是排好序的并且比当前大直接拼在当前之后就好 这样去想如果l1.next与l2已完成顺序合并,那么l1改指向谁呢? ?

    41120发布于 2021-01-18
  • 来自专栏悟道

    合并两个有序链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 递归解法 /** * Definition for singly-linked list.

    26640发布于 2021-06-10
  • 来自专栏张伦聪的技术博客

    合并两个有序链表

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

    28010编辑于 2022-10-26
领券