• 合并两个有序的链表


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

    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;
            }
    
            @Override
            public 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.next != null || large != 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 


    原文链接
     


     

  • 相关阅读:
    Android源码4.4.4_r1下载和编译
    [转]【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
    Android C语言_init函数和constructor属性及.init/.init_array节探索
    阅读android源码了解 android 加载so的流程
    div嵌套内层div的margin-top转移给外层div的解决办法
    实现在一个页面内,点击导航栏的不同链接,跳转到不同的页面
    当导航栏滚动到浏览器顶部时,固定导航栏
    如何在ios手机端的Safari浏览器 中“查看网页源代码”
    带有可点击区域的图像映射:HTML <map> 标签
    网页中如何使用一些特殊字体
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/12154803.html
Copyright © 2020-2023  润新知