标签:
已知两个单链表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