[LeetCode] #21 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
直接从左到右比较两个链表的val,谁小就把数字放在合并链表中并往后移。循环直到其中一个链表为空,再把不为空链表直接连接在合并链表后面。
/** * 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) { ListNode l3 = new ListNode(0); ListNode tmp = l3; while(l1 != null && l2 != null){ if(l1.val < l2.val){ tmp.next = l1; tmp = tmp.next; l1 = l1.next; }else{ tmp.next = l2; tmp = tmp.next; l2 = l2.next; } } if (l1 == null) { tmp.next = l2; } else { tmp.next = l1; } return l3.next; } }
之后逛到一种递归的解法,但思路和上面是一样的。
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode res = l1.val < l2.val ? l1 : l2; res.next = mergeTwoLists(res.next, l1.val >= l2.val ? l1 : l2); return res; } }
知识点:无
总结:递归可以把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。