链表:合并两个有序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
两种解法:递归和非递归
这个题目就是归并排序中的归并操作,将两个有序数组(链表)合并为一个有序的数组。
非递归:
第一个while循环,将 l1 和 l2 进行比较,谁小谁就合并到 listNode,直到 l1 或者 l2 为空
第二个while循环和第三个while循环,将 l1 或者 l2 剩下的节点合并到 listNode
最后返回的是 firstNode.next //头节点是不需要的
参考代码
递归:运行时间:27ms 占用内存:9564k
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode list1,ListNode list2) { 12 if(list1 == null) { 13 return list2; 14 } 15 if(list2 == null) { 16 return list1; 17 } 18 ListNode head = null; 19 if(list1.val < list2.val) { 20 head = list1; 21 head.next = Merge(list1.next, list2); 22 } else { 23 head = list2; 24 head.next = Merge(list1, list2.next); 25 } 26 return head; 27 } 28 }
非递归:运行时间:26ms 占用内存:9544k
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode l1, ListNode l2) { 12 ListNode listNode = new ListNode(0); 13 ListNode firstNode = listNode; 14 while (l1 != null && l2 != null) { //将 l1 和 l2 进行比较,谁小谁就合并到 listNode,直到 l1 或者 l2 为空 15 if (l1.val <= l2.val) { 16 listNode.next = l1; 17 l1 = l1.next; 18 } else { 19 listNode.next = l2; 20 l2 = l2.next; 21 } 22 listNode = listNode.next; 23 } 24 while (l1 != null) { //如果l2空了,就将剩余的l1加入到listNode中 25 listNode.next = l1; 26 l1 = l1.next; 27 listNode = listNode.next; 28 } 29 while (l2 != null) { //如果l1空了,就将剩余的l2加入到listNode中 30 listNode.next = l2; 31 l2 = l2.next; 32 listNode = listNode.next; 33 } 34 return firstNode.next; 35 } 36 }