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

leetcode 21

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

示例:

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

还是采用递归的方法,先贴出代码:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if( l1 == null ) { return l2; }
        if( l2 == null ) { return l1; }
        ListNode mergeHead = null;
        if(l1.val < l2.val){
            mergeHead = l1;
            mergeHead.next = mergeTwoLists(l1.next,l2);
        } else {  //这里把两者相等的情况也并了进去
            mergeHead = l2;
            mergeHead.next = mergeTwoLists(l1,l2.next);
        }
        return mergeHead;
    }

思路分析:

不得不说,每当我以为自己有点了解递归之后,就被啪啪打脸~~

之前做的题目都是只有一个链表,那么每次我只需要使用head.next就行。可以理解成每一次我都把子链丢出去处理,最后返回给我一个处理好的子链我就可以拼接到当前头结点上去。

那么这里有了两个链表,就不能理解成一个处理好的子链返回回来了。

那么写递归程序时我们往往不要钻到程序执行的角度去思考,那样很可能就绕不出来了。我们要尽量正向的去思考,去想一想每一次迭代的时候我想干啥。

就这道题而言,我们可以理解成每一次递归的时候都能保证子链的头结点是剩余所有元素中最小的那个

那么这样想的话,上面的程序就很容易理解了,因为链表是有序的,所以只要链表1的头结点小于链表2的头结点,那么链表1的头结点就一定是当前元素中最小的那个元素了,那么每一个元素的后继节点都是剩余所有元素中最小的那个,最后自然排出来就是一个有序的链表了。

以上都是自己的一些理解,可能不是什么好的思考方向,文笔有限,讲的可能也不是很清楚,但希望给大家提供一个思路。

递归还是需要做更多的题啊!!

错漏之处大家还是在评论区指出。

原文地址:https://www.cnblogs.com/bax-life/p/9703597.html

时间: 2024-08-03 13:11:17

链表--合并两个有序链表的相关文章

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *

合并两个有序链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

[leetcode] 21. 合并两个有序链表

21. 合并两个有序链表 两个有序链表合并为一个新的有序链表 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode ans = new ListNode(Integer.MAX_VALUE); ListNode p = ans; while (l1 != null && l2 != null) { if (l1.val < l2.val) { p.next = l1; l

[LeetCode]21 Merge Two Sorted Lists 合并两个有序链表

---恢复内容开始--- [LeetCode]21 Merge Two Sorted Lists 合并两个有序链表 Description Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. Example Example: Input: 1->2->4, 1-&g

LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode21. Merge Two Sorted Lists 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 Java 实现 ListNode 类 class ListNode { int val; ListNode n

LeetCode - 合并两个有序链表(No.21)

21 - 合并两个有序链表 date: Dec.28th, 2019 platform: windows thinking a recursive method is implemented. code /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListN

每天AC系列(七):合并两个有序链表

1 题目 LeetCode第21题,合并两个有序链表. 2 直接合并 因为已经有序了,类似归并排序中的合并一样,操作不难,直接上代码了. ListNode t = new ListNode(0); ListNode head = t; while(l1 != null && l2 != null) { if(l1.val < l2.val) { t.next = l1; l1 = l1.next; } else { t.next = l2; l2 = l2.next; } t = t