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

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

以小到大有序基准的单向链表,算法原理:
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;
    }
}

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值