21. 合并两个有序链表/面试题25. 合并两个排序的链表(简单)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
思路1:
这里使用递归的思路,用l3做新链表接收(也可以直接用l1或者l2做新的链表),每次比较出来新的节点,将剩下的继续递归比较,直到链表结束,时间空间复杂度都为O(m+n),当然本题也可以用迭代的方法解决
思路2:
迭代思路为 我们假设 l1
元素严格比 l2
元素少,我们可以将 l2
中的元素逐一插入 l1
中正确的位置。
首先,我们设定一个哨兵节点 “prehead” ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前位置的值小于等于 l2 ,我们就把 l1 的值接在 prev 节点的后面同时将 l1 指针往后移一个。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都把 prev 向后移一个元素。
在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表。
代码1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null) return l2; if(l2 == null) return l1; ListNode l3 = null; if(l1.val<l2.val){ l3 = l1; l3.next =mergeTwoLists(l1.next,l2); }else{ l3 = l2; l3.next =mergeTwoLists(l1,l2.next); } return l3; } }
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } else if (l2 == null) { return l1; } else if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }
|
代码2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null || l2 == null) { return l1 != null ? l1 : l2; } ListNode l3 = new ListNode(); ListNode l4 = l3; while(l1 !=null && l2!=null){ if(l1.val<=l2.val){ l3.next = l1; l1 = l1.next; }else{ l3.next = l2; l2 = l2.next; } l3 = l3.next; } l3.next = l1==null?l2:l1; l4 = l4.next; return l4; } }
|