将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
新建一个节点,比较传入的节点值,取小的值赋予新节点,递归调用小值的下一个节点和另一个不变的节点,出口是比较结束返回新建节点。
emm,问题是每次递归多增加了一个节点,导致空间消耗增加,解决办法可以直接返回比较后小的节点,这样之后可能就是消耗的。
自己写的代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //如果结果为空,直接返回另一个节点 if(l1==null){ return l2; } if(l2==null){ return l1; } //这里新建节点用于保存,对链表结构掌握不清晰,可以直接修改next指针 ListNode node = new ListNode(); if(l1.val>=l2.val){ node.val = l2.val; node.next = mergeTwoLists(l1,l2.next); } if(l1.val<l2.val){ node.val = l1.val; node.next = mergeTwoLists(l1.next,l2); } return node; } }官方算法–迭代
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //编写头节点 ListNode prehead = new ListNode(-1); //赋值,作用是用于循环。 ListNode prev = prehead; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { // prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可 prev.next = l1 == null ? l2 : l1; //返回头结点之后的链表 return prehead.next; }执行时间很快,迭代比递归快,耗费内存比较多,官方的递归也做得比我好,空间方面比我节省。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } else if (l2 == null) { return l1; } else if (l1.val < l2.val) { //在这里并没有直接赋新值,而是改变每个节点的next尾巴, //让next指向下一个比它小的数值!妙啊! l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } }leetCode
妙得一塌糊涂,哈哈哈哈!------swrici