刷题笔记链表数据结构Leetcode21. 合并两个有序链表
赵海波
21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
1 2
| 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
|
示例 2:
1 2
| 输入:l1 = [], l2 = [] 输出:[]
|
示例 3:
1 2
| 输入:l1 = [], l2 = [0] 输出:[0]
|
解法1:递归法
根据以上规律考虑本题目:
终止条件:当两个链表都为空时,表示我们对链表已合并完成。
如何递归:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1==null)return list2; if (list2==null)return list1;
if (list1.val < list2.val){ list1.next = mergeTwoLists(list1.next,list2); return list1; }else { list2.next = mergeTwoLists(list1,list2.next); return list2; } } }
|
主要想清楚几点问题就行了 1.这个问题的子问题是什么。2.当前层要干什么事情。3.递归出口。想清楚这几点就好啦。
很多刚接触递归的同学习惯往深处想,就想想清楚下一层,下下层到底咋回事,千万别!这样永远也想不清楚的,你只要把当前层的事情干好,边界条件找好,深层自然而然就是对的。千万别想那么深。
解法3:模拟法(比较垃圾)
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
| class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if(list1==null)return list2; if(list2 == null)return list1;
ListNode start = new ListNode(1); if (list1.val > list2.val) { start.val = list2.val; list2 = list2.next; }else { start.val = list1.val; list1 = list1.next; } ListNode cur = start;
while(list1 !=null && list2 != null){ if (list1.val > list2.val){ cur.next = new ListNode(list2.val); list2 = list2.next; }else { cur.next = new ListNode(list1.val); list1 = list1.next; } cur = cur.next; } cur.next = list1 == null?list2:list1; return start; } }
|