文章目录
- Merge Two Sorted Lists 合并两个有序链表
- 问题描述:
- 分析
- 代码
- 迭代
- 递归
- Tag
Merge Two Sorted Lists 合并两个有序链表
问题描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
两个链表的节点数目范围是 [ 0 , 50 ] − 100 < = N o d e . v a l < = 100 l 1 和 l 2 均按非递减顺序排列 两个链表的节点数目范围是 [0, 50]\\ -100 <= Node.val <= 100\\ l1 和 l2 均按 非递减顺序 排列 两个链表的节点数目范围是[0,50]−100<=Node.val<=100l1和l2均按非递减顺序排列
分析
常见的思路,就是开一个新链表l3,每次从l1,l2中找最小的插入l3.时间复杂度 O ( N + M ) O(N+M) O(N+M),空间 O ( 1 ) O(1) O(1)。整体就是一个链表状态的归并。
当然也有递归的处理方式,就是将迭代的改一下。
递归的缺点就是空间复杂度是 O ( N + M ) O(N+M) O(N+M)
代码
迭代
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode h3 = new ListNode(-1);ListNode p3 = h3,p1 = list1,p2 = list2;while(p1!=null||p2!=null){if(p1==null||p2==null){p3.next = p1!=null?p1:p2;break;}if(p1.val<=p2.val){p3.next = p1;p1 = p1.next; }else{p3.next = p2;p2 = p2.next; } p3 = p3.next;p3.next = null; }return h3.next;}
时间复杂度 O ( N + M ) O(N+M) O(N+M)
空间复杂度 O ( 1 ) O(1) O(1)
递归
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1==null||list2==null){return list1==null?list2:list1;} if(list1.val<= list2.val){ list1.next = mergeTwoLists(list1.next,list2);return list1;}list2.next = mergeTwoLists(list1,list2.next) ; return list2; }
时间复杂度 O ( N + M ) O(N+M) O(N+M)
空间复杂度 O ( N + M ) O(N+M) O(N+M)
Tag
Recursion
Linked List