链表:合并两个有序的链表

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 

 

以上是关于链表:合并两个有序的链表的主要内容,如果未能解决你的问题,请参考以下文章

合并两个有序的单链表,合并之后的链表依然有序出现频率高

java牛客BM4.合并两个排序的链表 BM5. 合并k个已排序的链表

算法题:合并两个有序的链表

剑指Offer-16:合并两个有序链表

剑指offer 17:合并两个有序链表

面试题25:合并两个排序的链表