题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1:
1 2
| 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
|
思路1
分为两步:
第一步: 记录所有的链表的数值并排序。因为链表的长度未知,所以需要用 List 来存储。
第二步: 按照排序后的链表数值,建立对应链表。
代码
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 32 33 34
|
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null&&l2==null) return null; if(l1!=null&&l2==null) return l1; if(l1==null&&l2!=null) return l2; List<Integer> list = new ArrayList<>(); while(l1!=null){ list.add(l1.val); l1=l1.next; } while(l2!=null){ list.add(l2.val); l2=l2.next; } Collections.sort(list); int size = list.size(); ListNode result = new ListNode(list.get(0).intValue()); ListNode pev = result; for(int i=1;i<size;i++){ ListNode tmp = new ListNode(list.get(i).intValue()); pev.next = tmp; pev = tmp; } return result; } }
|
思路2
官方题解:采用递归方法。
终止条件:l1 = null 或者 l2 = null。
判断条件:
if(l1.val<l2.val): mergeTwoLists(l1.next, l2)
else: mergeTwoLists(l1, l2.next)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 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; } } }
|
思路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
|
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode preHead = new ListNode(-1); ListNode preNode = preHead; while(l1!=null&&l2!=null){ if(l1.val<l2.val){ preNode.next = l1; l1 = l1.next; }else{ preNode.next = l2; l2 = l2.next; } preNode = preNode.next; } preNode.next = l1==null?l2:l1; return preHead.next; } }
|