将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
先创建一个结点pre,结点的next指向两个头结点的较小的那个。
再进行循环判断:如果list1指向的值小于等于list2指向的值,那么pre.next就指向list1,而list1要指向list1的下一个结点,pre也要向前推进一格指向pre.next,循环终止的条件就是有一个链表已经遍历完毕了,这时候就将pre.next指向剩余链表的剩余部分
时间复杂度为:O(N+M)
空间复杂度为:O(1)//只需要多创建一个pre结点
public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1 == null || list2 == null) { return list1 == null ? list2 : list1; } ListNode pre1 = new ListNode(-1); ListNode head = pre1; while(list1!=null&&list2!=null){ if(list1.val<= list2.val){ pre1.next = list1; pre1 = list1; list1 = list1.next; } else { pre1.next = list2; pre1 = list2; list2 = list2.next; } } if(list1!=null){ pre1.next = list1; }else { pre1.next = list2; } return head.next; }
方法二:递归
递归在排序和寻找最大最小值的时候思路非常清晰,当找到小的结点后,就将小的结点的next指向剩余部分的最小结点。
可以去下面的网址查看清晰动图,非常的明白清楚。
https://leetcode.cn/problems/merge-two-sorted-lists/solution/yi-kan-jiu-hui-yi-xie-jiu-fei-xiang-jie-di-gui-by-/
public static ListNode mergeTwoLists2(ListNode l1,ListNode l2){ if(l1 == null){ return l2; }else if(l2 == null){ return l1; } else if (l1.val<l2.val) { l1.next = mergeTwoLists2(l1.next,l2); return l1; }else { l2.next = mergeTwoLists2(l1,l2.next); return l2; } }