两个有序单链表的合并
2015-10-25 18:03
351 查看
已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序
这个类似归并排序。尤其注意两个链表都为空,和其中一个为空时的情况。只需要O(1)的空间。时间复杂度为O(max(len1, len2))
递归实现:
这个类似归并排序。尤其注意两个链表都为空,和其中一个为空时的情况。只需要O(1)的空间。时间复杂度为O(max(len1, len2))
public static Node mergeSortedList(Node head1, Node head2) { // 其中一个链表为空的情况,直接返回另一个链表头,O(1) if (head1 == null) { return head2; } if (head2 == null) { return head1; } Node mergeHead = null; // 先确定下来mergeHead是在哪里 if (head1.val < head2.val) { mergeHead = head1; head1 = head1.next; // 跳过已经合并了的元素 mergeHead.next = null; // 断开mergeHead和后面的联系 } else { mergeHead = head2; head2 = head2.next; mergeHead.next = null; } Node mergeCur = mergeHead; while (head1 != null && head2 != null) { if (head1.val < head2.val) { mergeCur.next = head1; // 把找到较小的元素合并到merge中 head1 = head1.next; // 跳过已经合并了的元素 mergeCur = mergeCur.next; // 找到下一个准备合并的元素 mergeCur.next = null; // 断开mergeCur和后面的联系 } else { mergeCur.next = head2; head2 = head2.next; mergeCur = mergeCur.next; mergeCur.next = null; } } // 循环结束只有一条链表还有元素 // 合并剩余的元素 if (head1 != null) { mergeCur.next = head1; } else if (head2 != null) { mergeCur.next = head2; } return mergeHead; }
递归实现:
public static Node mergeSortedListRec(Node head1, Node head2) { if (head1 == null) { return head2; } if (head2 == null) { return head1; } Node mergeHead = null; if (head1.val < head2.val) { mergeHead = head1; // 连接已解决的子问题 mergeHead.next = mergeSortedListRec(head1.next, head2); } else { mergeHead = head2; mergeHead.next = mergeSortedListRec(head1, head2.next); } return mergeHead; }
相关文章推荐
- TCP粘包处理 参考spserver
- 配置docker中免密码SSH
- Android 四大缓存框架之-Universal-Image-Loader
- LAYERSLIDER 5插件源码破解
- 明确指定+两种自动将行内元素变成块级元素的方法
- iOS 9 更新速度快
- VB代码匹配两个工作薄的表格信息,并修改
- ionic 使用ngcordova插件
- 对于新发布的xcode 7.1以及iOS 9.0会出现哪些上传错误信息
- 《精益开发实战——大项目看板管理》读书笔记
- Tunnelling Ventilation Deduster--网上看到的,感觉要是真能达到30方每秒的风量还是不错的
- Wndows 10升级方法(非OEM版)
- OC 数组相关
- SMAcss学习笔记
- socket
- [LeetCode]41. String to Integer(atoi)字符串转整数
- 初学C语言----指针深入了解 :指针与函数
- c++面向对象程序设计
- Andorid开发中如何去除标题栏title
- 初学C语言----指针深入了解 :结构体指针