合并两个有序的链表

先自己实现一个单向的链表

package constxiong.interview;/** * 单向链表 * @author ConstXiong * @param <E> */class SingleLinkedList<E> {int size = 0;Node<E> first;Node<E> last;public SingleLinkedList() {}public void add(E e) {Node<E> l = last;Node<E> item = new Node<E>(e, null);last = item;if (l == null) {this.first = item;} else {l.next = item;}size++;}/** * 打印链表 * @param ll */public void print() {for (Node<E> item = first; item != null; item = item.next) {System.out.print(item + " ");}}/** * 单向链表中的节点 * @author ConstXiong * @param <E> */public static class Node<E> {E item;Node<E> next;Node(E item, Node<E> next) {this.item = item;this.next = next;}public E get() {return item;}@Overridepublic String toString() {return item.toString();}}}

题目中链表是有序的,所以不需要考虑排序问题

mergeeSingleLinkedList 方法合并链表,思路

  • 获取两个链表中的首节点
  • 比较首节点大小,结果分别存入 small、large 节点
  • 把 small 节点存入新的链表,再比较获取 small.next和 large,结果分别存入 small、large 节点
  • 直到 small.next 和 large 都为 null
package constxiong.interview;import constxiong.interview.SingleLinkedList.Node;/** * 链表两个有序列表 * @author ConstXiong * @date 2019-11-06 09:37:14 */public class TestMergeLinkedList {public static void main(String[] args) {SingleLinkedList<Integer> ll1 = new SingleLinkedList<Integer>();ll1.add(3);ll1.add(8);ll1.add(19);SingleLinkedList<Integer> ll2 = new SingleLinkedList<Integer>();ll2.add(3);ll2.add(10);ll2.add(17);mergeeSingleLinkedList(ll1, ll2).print();}/** * 合并两个有序列表 * @param ll1 * @param ll2 * @return */private static SingleLinkedList<Integer> mergeeSingleLinkedList(SingleLinkedList<Integer> ll1, SingleLinkedList<Integer> ll2) {if (isEmpty(ll1) || isEmpty(ll2)) {return isEmpty(ll1) ? ll2 : ll1;}SingleLinkedList<Integer> ll = new SingleLinkedList<Integer>();Node<Integer> ll1Node = ll1.first;Node<Integer> ll2Node = ll2.first;Node<Integer> small = ll1Node.get() <= ll2Node.get() ? ll1Node : ll2Node;Node<Integer> large = ll1Node.get() > ll2Node.get() ? ll1Node : ll2Node;do {ll.add(small.get());Node<Integer> smallNext = small.next;if (smallNext == null || large == null) {small = smallNext == null ? large : smallNext;large = null;} else {small = smallNext.get() <= large.get() ? smallNext : large;large = smallNext.get() > large.get() ? smallNext : large;}}while (small != null);return ll;}/** * 测试链表存储是否OK */public static void testSingleLinkedListIsOk() {SingleLinkedList<Integer> ll = new SingleLinkedList<Integer>();ll.add(3);ll.add(8);ll.add(19);ll.print();}private static boolean isEmpty(SingleLinkedList<Integer> ll) {if (ll == null || ll.size == 0) {return true;}return false;}}

打印结果

3 3 8 10 17 19

给TA打赏
共{{data.count}}人
人已打赏
Java

选择排序(Selection Sort)

2020-7-31 3:33:20

Java

同样的复杂度,为什么插入排序比冒泡排序更受欢迎?

2020-7-31 3:36:40

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索