[LintCode] Merge Two Sorted Lists [附Recursion solution]
Merge Two Sorted Lists
Merge two sorted (ascending) linked lists and return it as a new sorted list. The new sorted list should be made by splicing together the nodes of the two lists and sorted in ascending order.
Example
Given 1->3->8->11->15->null, 2->null , return 1->2->3->8->11->15->null.
SOLUTION1:
链表在merge的时候其实要有优势的,它不需要额外空间,不想array,要重新开一个空间放array。操作的时候也很简单,弄一个dummy,然后把小的直接连上就行了。此题属于基本操作,在其他题里完全可以作为function调用。
代码:
/** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val = val; * this.next = null; * } * } */ public class Solution { /** * @param ListNode l1 is the head of the linked list * @param ListNode l2 is the head of the linked list * @return: ListNode head of linked list */ public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null){ return l2; } if (l2 == null){ return l1; } ListNode dummy = new ListNode(0); ListNode node = dummy; while (l1 != null && l2 != null){ if (l1.val < l2.val){ node.next = new ListNode(l1.val); l1 = l1.next; node = node.next; } else { node.next = new ListNode(l2.val); l2 = l2.next; node = node.next; } } while (l1 != null){ node.next = new ListNode(l1.val); l1 = l1.next; node = node.next; } while (l2 != null){ node.next = new ListNode(l2.val); l2 = l2.next; node = node.next; } return dummy.next; } }
SOLUTION2:
当然链表也可以使用recursion解决,在recursion的过程中由于callbacl stack的使用,导致空间复杂度退化为O(n) n为两个链表最长的长度。但是在写法上实在是太简化了,所以也要学会使用。
Recursion:
1, Define subproblem;
2, Find recursion tree;
3, Define base case;
本题中:
1, Define subproblem; l1.next / l2.next (P.S, 链表问题都是砍“头”,即子问题变为cur.next的问题)
2, Find recursion rule; l1.next / l2.next 将砍掉的两个头的next指针接到新返回的newHead上
3, Define base case; 一个为null,返回另一个
public class Solution { /* * @param l1: ListNode l1 is the head of the linked list * @param l2: ListNode l2 is the head of the linked list * @return: ListNode head of linked list */ public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //base case if (l1 == null) { return l2; } if (l2 == null) { return l1; } if (l1.val <= l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }
浙公网安备 33010602011771号