题目
1 2 3 4 5 6 7 8 9 10
| 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制:
0 <= 链表长度 <= 1000
|
思想
双指针,声明一个变量记录新链表中的最大值,对每一个链表声明一个指针,先比较这两个指针中的值,小的值追加到新链表后指针++
实现
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 35 36 37 38
| private static class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } if (l2 == null) { return l1; }
ListNode newListNode = null; if (l1.val <= l2.val) { newListNode = new ListNode(l1.val); l1 = l1.next; } else { newListNode = new ListNode(l2.val); l2 = l2.next; } ListNode head = newListNode; while (l1 != null || l2 != null) { if (l1 == null) { newListNode.next = new ListNode(l2.val); l2 = l2.next; } else if (l2 == null) { newListNode.next = new ListNode(l1.val); l1 = l1.next; } else if (l1.val <= l2.val) { newListNode.next = new ListNode(l1.val); l1 = l1.next; } else { newListNode.next = new ListNode(l2.val); l2 = l2.next; } newListNode = newListNode.next; }
return head; } }
|
代码冗余
优化:
三点没有意识到:
- 初始化的时候可以随便初始化一个,最后返回head.next
- 节点赋值的时候,我是用的new ListNode,这样太浪费性能了,可以直接复制了的,相当于复制了一个指针
- 最后有一条链表为空的时候,剩下的可以直接复制过去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| private static class Solution2 { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode newListNode = new ListNode(0), head = newListNode; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { newListNode.next = l1; l1 = l1.next; } else { newListNode.next = l2; l2 = l2.next; } newListNode = newListNode.next; } newListNode.next = l1 == null ? l2 : l1;
return head.next; } }
|