leetcode-21-合并两个有序链表(merge two sorted lists)-java

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/82217233

题目及用例

package pid021;
/*合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4


*/


import pid021.LinkList;
import pid021.LinkList.ListNode;

public class main {


    public static void main(String[] args) {

        LinkList a=new LinkList(1);
        a.addLast(2);
        a.addLast(5);

        LinkList b=new LinkList(-5);
        b.addLast(0);
        b.addLast(500);

        a.printList();      
        b.printList();
        test(a.first,b.first);

        LinkList c=new LinkList(1);
        c.addLast(2);
        c.addLast(500);
        LinkList d=new LinkList(1);
        d.addLast(2);
        d.addLast(3);

        c.printList();      
        d.printList();
        test(c.first,d.first);
    }

    private static void test(ListNode ito,ListNode ito2) {
        Solution solution = new Solution();
        ListNode rtn;
        long begin = System.currentTimeMillis();
        System.out.println();
        //开始时打印数组

        rtn=solution.mergeTwoLists(ito,ito2);//执行程序
        long end = System.currentTimeMillis();  

        rtn.printNodeToEnd();

        //System.out.println(":rtn" );
        //System.out.print(rtn);
        System.out.println();
        System.out.println("耗时:" + (end - begin) + "ms");
        System.out.println("-------------------");
    }

}

linklist

package pid021;


public class LinkList {
    public class ListNode {
      public int val;
      public ListNode next;
      ListNode(int x) 
      { val = x; 
        next=null;
      }
      public ListNode() {
          val=0;
          next=null;
      }

      public void printNodeToEnd(){
        ListNode a=this;
        System.out.println("print node to end");
        while(a!=null){//直到最后一个不为空的节点
            System.out.print(a.val+"  ");
            a=a.next;
        }
        System.out.println();
      }
    }

    ListNode first;

    public LinkList(int x){
        first=new ListNode(x);
        first.next=null;
    }
    public LinkList(){
        first=null;
        first.next=null;
    }

    public void addLast(int x){

        if(first==null){
            first=new ListNode(x);
            return;
        }
        ListNode a=first;
        while(a.next!=null){
            a=a.next;
        }
        ListNode b=new ListNode(x);
        a.next=b;
    }

    public void printList(){
        ListNode a=first;
        System.out.println("print listnode");
        while(a!=null){//直到最后一个不为空的节点
            System.out.print(a.val+"  ");
            a=a.next;
        }
        System.out.println();
    }



}

解法1(成功,速度很慢,25ms)
逐次比较两个链表的头,小的变为结果集的尾部,两者指针皆向前移动一步

package pid021;


import pid021.LinkList;
import pid021.LinkList.*;
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode a=l1;
        ListNode b=l2;
        ListNode head=null;
        ListNode now=null;

        if(a==null){
            return l2;
        }
        if(b==null){
            return l1;
        }//异常情况

        if(a.val<=b.val){
            head=a;
            now=a;
            a=a.next;
        }
        else{
            head=b;
            now=b;
            b=b.next;
        }//初始化

        while(a!=null&&b!=null){
            if(a.val<=b.val){//谁比较小,则让结果链的下一个为他,结果链和这个链各向后一步
                now.next=a;
                a=a.next;
                now=now.next;
            }
            else{
                now.next=b;
                b=b.next;
                now=now.next;
            }
        }

        if(a==null){
            now.next=b;
        }

        if(b==null){
            now.next=a;
        }

        return head;
    }
}

但是别人的方法都和这种基本一样,都为o(n),不知道为什么那么快

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/82217233