剑指offer java NO17

NO17
输入两个递增排序的链表,合并这两个链表
并使新链表中结点仍然是按照递增排序的。
例如输入1->3->5->7和2->4->6->8,
则合并之后的升序链表应该是1->2->3->4->5->6->7->8 。

先写一个单向链表类

/**
 * @author 
 * 单向链表
 */
public class Node {

    String data;
    Node next;

    public Node(){

    }
    public Node(String data) {
        super();
        this.data = data;
    }

    public Node(String data, Node next) {
        super();
        this.data = data;
        this.next = next;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Node getNext() {
        return next;
    }
}

解题代码:

import com.company.base.Node;
/**
 * 输入两个递增排序的链表,合并这两个链表
 * 并使新链表中结点仍然是按照递增排序的。
 * 例如输入1->3->5->7和2->4->6->8,
 * 则合并之后的升序链表应该是1->2->3->4->5->6->7->8 。
 */
public class NO17 {
    public static void main(String[] args) {
        Node node1 = new Node("1");
        Node node2 = new Node("2");
        Node node3 = new Node("3");
        Node node4 = new Node("4");
        Node node5 = new Node("5");
        Node node6 = new Node("6");
        Node node7 = new Node("7");
        Node node8 = new Node("8");
        node1.setNext(node3);
        node2.setNext(node4);
        node3.setNext(node5);
        node4.setNext(node6);
        node5.setNext(node7);
        node6.setNext(node8);
        NO17A no17A = new NO17A();
        System.out.println("list1: ");
        no17A.printOrderList(node1);
        System.out.println();
        System.out.println("list2: ");
        no17A.printOrderList(node2);
        System.out.println();
        System.out.println("oderlist: ");
        no17A.orderListMethod(node1, node2);
    }
}

class NO17A{
    //封装的方法
    public void orderListMethod(Node head1, Node head2){
        printOrderList(orderList(head1, head2));
    }
    //对两个链表进行排序
    private Node orderList(Node head1, Node head2){
        Node temp = new Node();
        Node temp1 = new Node();
        temp1 = head1;
        //如果有任意一个链表为空,则抛出异常
        if (head1 == null || head2 == null)
        {
            throw new RuntimeException("any of the two lists shouldn't be empty!");
        }
        /*如果链表1的头结点大于链表2头结点,则将head1 与 head2 互换,确保链表1的头结点小于等于链表2头结点*/
        if (Integer.parseInt(head1.getData()) > Integer.parseInt(head2.getData()))
        {
            temp = head1;
            head1 = head2;
            head2 = temp;
        }
        //排序过程
        for (; head1.getNext() != null; head1 = head1.getNext())
        {
        	/*如果head1 的下一个节点的值大于head2,则将和head2 的节点插入其中*/
            while (Integer.parseInt(head1.getNext().getData()) >= Integer.parseInt(head2.getData()) )
            {
                temp = head2.getNext();
                head2.setNext(head1.getNext());
                head1.setNext(head2);
                //如果head2 有下一个节点,则将head2右移一个
                if (temp.getData() != null)
                {
                    head2 = temp;
                }
                /*如果没有,说明链表2已经完全排序结束,可以直接输出链表头部节点*/
                else
                {
                    return temp1;
                }
            }
        }
        /*如果链表1已经循环结束之后链表2还有剩余的值,则需要将剩余的值的头结点接在链表1结尾进行输出*/
        if (head2.getData() != null){
            head1.setNext(head2);
        }
        return temp1;
    }
    //打印链表
    public void printOrderList(Node head){
        for (; head != null; head = head.getNext()){
            System.out.println(head.getData());
        }
    }
}

运行结果:

list1: 
1357

list2: 
2468

oderlist: 
12345678

Process finished with exit code 0

吃晚饭去了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值