输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

来源:互联网 发布:武汉app软件开发 编辑:程序博客网 时间:2024/05/13 17:12

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

思路:这就是一个二路归并的实现。

不过就是初始数据是存储在链表当中的。

部分代码:

/*
public class ListNode {
    int val;
    ListNode next = null;


    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.ArrayList;
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null&&list2==null){//两个链表都是空的
            return null;
        }
        ArrayList<ListNode> list11 = new ArrayList<>();
        ArrayList<ListNode> list22 = new ArrayList<>();
        while(list1!=null){
            list11.add(list1);
            list1 = list1.next;
        }
        while(list2!=null){
            list22.add(list2);
            list2 = list2.next;
        }
        if(list11.size()==0){
            ListNode node1 = new ListNode(list22.get(0).val);
            ListNode node2 = node1;
            for(int i = 1;i<list22.size();i++){
                node1.next = new ListNode(list22.get(i).val);
                node1 = node1.next;
            }
            return node2;
        }
        if(list22.size()==0){
           ListNode node1 = new ListNode(list11.get(0).val);
            ListNode node2 = node1;
            for(int i = 1;i<list11.size();i++){
                node1.next = new ListNode(list11.get(i).val);
                node1 = node1.next;
            }
            return node2;
        }
        
        ListNode node = new ListNode(list11.get(0).val>list22.get(0).val?list22.get(0).val:list11.get(0).val);
        ListNode result = node;

//说明:此处用两个变量的原因,有人直接只定义一个变量,并且给变量初始化为null,但是注意当初始化为null的对象,内存并没有给它分配地址。

  //     一个变量node是中间变量,相当于是指针当前所指的,而result就是返回的了。在最开始的时候,赋值result = node,是让result指向node的最   //         开始的位置。
        int index1 = 0;
        int index2 = 0;
        if(list11.get(0).val>list22.get(0).val){
            index2 = 1;
        }else{
            index1 = 1;
        }
        for(int i = 0;i<(list11.size()+list22.size());i++){
            if(index1<list11.size()&&index2<list22.size()&&list11.get(index1).val>=list22.get(index2).val){
                node.next = new ListNode(list22.get(index2).val);
                node = node.next;
                index2++;
                if(index2==list22.size()){
                    break;
                }
            }else if(index1<list11.size()&&index2<list22.size()){
                node.next = new ListNode(list11.get(index1).val);
                node = node.next;
                index1++;
                if(index1==list11.size()){
                    break;
                }
            }else{
                break;
            }
        }
        if(index1<list11.size()){
            node.next = new ListNode(list11.get(index1).val);
            node = node.next;
            index1++;
        }else{
            node.next = new ListNode(list22.get(index2).val);
            node = node.next;
            index2++;
        }


        return result;
    }
}

speak to myself:在编代码之前,我已经看出关键了,但是编出来的代码还是有一点繁琐。而且稍微一点失误,就不行。之后看了大家的代码,醍醐灌顶。还是要看看其他人的代码,当然是自己做完之后了。看看自己有什么优点,又有什么不足。取长补短,我相信,随着时间的过去,会有所提高的。

阅读全文
0 0
原创粉丝点击