码迷,mamicode.com
首页 > 其他好文 > 详细

两个有序单链表的合并

时间:2015-10-25 19:17:36      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序
这个类似归并排序。尤其注意两个链表都为空,和其中一个为空时的情况。只需要O(1)的空间。时间复杂度为O(max(len1, len2))

 1 public static Node mergeSortedList(Node head1, Node head2) {
 2         // 其中一个链表为空的情况,直接返回另一个链表头,O(1)
 3         if (head1 == null) {
 4             return head2;
 5         }
 6         if (head2 == null) {
 7             return head1;
 8         }
 9 
10         Node mergeHead = null;
11         // 先确定下来mergeHead是在哪里
12         if (head1.val < head2.val) {
13             mergeHead = head1;
14             head1 = head1.next; // 跳过已经合并了的元素
15             mergeHead.next = null; // 断开mergeHead和后面的联系
16         } else {
17             mergeHead = head2;
18             head2 = head2.next;
19             mergeHead.next = null;
20         }
21 
22         Node mergeCur = mergeHead;
23         while (head1 != null && head2 != null) {
24             if (head1.val < head2.val) {
25                 mergeCur.next = head1; // 把找到较小的元素合并到merge中
26                 head1 = head1.next; // 跳过已经合并了的元素
27                 mergeCur = mergeCur.next; // 找到下一个准备合并的元素
28                 mergeCur.next = null; // 断开mergeCur和后面的联系
29             } else {
30                 mergeCur.next = head2;
31                 head2 = head2.next;
32                 mergeCur = mergeCur.next;
33                 mergeCur.next = null;
34             }
35         }
36         // 循环结束只有一条链表还有元素
37         // 合并剩余的元素
38         if (head1 != null) {
39             mergeCur.next = head1;
40         } else if (head2 != null) {
41             mergeCur.next = head2;
42         }
43 
44         return mergeHead;
45     }

递归实现:

 1 public static Node mergeSortedListRec(Node head1, Node head2) {
 2         if (head1 == null) {
 3             return head2;
 4         }
 5         if (head2 == null) {
 6             return head1;
 7         }
 8 
 9         Node mergeHead = null;
10         if (head1.val < head2.val) {
11             mergeHead = head1;
12             // 连接已解决的子问题
13             mergeHead.next = mergeSortedListRec(head1.next, head2);
14         } else {
15             mergeHead = head2;
16             mergeHead.next = mergeSortedListRec(head1, head2.next);
17         }
18         return mergeHead;
19     }

 

两个有序单链表的合并

标签:

原文地址:http://www.cnblogs.com/winner-0715/p/4909173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!