将两个有序的单向链表整合成一个有序单向链表

来源:互联网 发布:windows 10桌面美化 编辑:程序博客网 时间:2024/05/19 12:11

题目:将两个有序的单向链表整合成一个新的有序单向链表。

以小到大有序基准的单向链表,算法原理:
1、取链表A,链表B 各自头节点进行比较,确定新链表的头节点。
2、若取的是链表A的节点,取出链表A该节点的下一节点与B链表当前节点比较,新链表的节点指向比较得出的小节点。
3、循环步骤2,直至链表A,B其中一个到达结尾,将新链表尾节点指向未到达结尾的链表当前节点,算法结束。

将有序单向链表转向输出:
1、将下一节点指向前一节点。
2、由于需从原链表尾节点开始执行,所以进行递归。

public class Test {    public static void main(String[] args) {        Node a = new Node(1);        Node b = new Node(3);        Node d = new Node(5);        a.next = b;        b.next = d;        Node A = new Node(2);        Node B = new Node(3);        Node C = new Node(4);        Node D = new Node(6);        A.next = B;        B.next = C;        C.next = D;        print(a);        print(A);        print(sortNodeBigFirstFromSmallFirst(a, A));    }    public static void print(Node a){        Node tmp = a;        StringBuffer sb = new StringBuffer();        while (tmp != null) {            sb.append(tmp.val);            sb.append(' ');            tmp = tmp.next;        }        System.out.println(sb);    }    /**     * 按小到大单向链表     * @param a     * @param b     * @return     */    public static Node sortNodeSmallFirst(Node a, Node b) {        Node ret = null;        if(a == null)            ret = b;        else if(b == null)            ret = a;        else{            Node tmp;            if(a.val < b.val){                tmp = a;                a = a.next;            }else{                tmp = b;                b = b.next;            }            ret = tmp;//确定头节点            while(a != null && b != null){                if(a.val < b.val){                    tmp.next= a;                    a = a.next;                }else{                    tmp.next = b;                    b = b.next;                }                tmp = tmp.next;            }            tmp.next = (a == null?b:a);        }        return ret;    }    /**     * 将按小到大单向链表转成反向链表     * @param a     * @param b     * @return     */    public static Node sortNodeBigFirstFromSmallFirst(Node a, Node b) {        Node sortNodeSmall= sortNodeSmallFirst(a, b);        print(sortNodeSmall);        Node ret = reverse(sortNodeSmall);        return ret;    }    public static Node reverse(Node src){        Node ret = null;        if(src.next != null){            ret = reverse(src.next);            src.next.next = src;            src.next = null;        }else            ret = src;        return ret;    }}class Node {    Node next;    public int val;    public Node(int i) {        val = i;    }}

输出结果:
这里写图片描述

0 0