链表:合并两个有序的链表
Posted carry6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表:合并两个有序的链表相关的知识,希望对你有一定的参考价值。
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
两种解法:递归和非递归
这个题目就是归并排序中的归并操作,将两个有序数组(链表)合并为一个有序的数组。
非递归:
第一个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
以上是关于链表:合并两个有序的链表的主要内容,如果未能解决你的问题,请参考以下文章