[名企面试知识点][Java]合并两个排序链表
发布于 2017-03-08 13:34 2353 次浏览 0 赞 来自 资源分享  

题目描述

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

输入描述

两个单调递增的链表

输出描述

一个单调不减的链表

题目分析

节点申明:

public class ListNode {
   int val;
   ListNode next = null;
   ListNode(int val) {
       this.val = val;
   }
}

解法一 (递归) 运行时间:31ms  占用内存:629k

public class Solution {
   public ListNode Merge(ListNode list1,ListNode list2) {
       if(list1==null) return list2;
       if(list2==null) return list1;

       ListNode mergeHead=null;
       if(list1.val<=list2.val){
           mergeHead = list1;
           mergeHead.next = Merge(list1.next,list2);
       }else{
           mergeHead = list2;
           mergeHead.next = Merge(list1,list2.next);
       }
       return mergeHead;
   }
}

  首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。   因为合并后的链表要满足单调不减,比较两个链表当前头结点,值较小的赋值给合并链表的当前节点,依次递归下一个节点。   依次返回合并链表的当前节点。

解法二  运行时间:31ms  占用内存:629k

public class Solution {
   public ListNode Merge(ListNode list1,ListNode list2) {
       if(list1==null) return list2;
       if(list2==null) return list1;

       ListNode mList=new ListNode(0);
       ListNode point =mList;

       while(list1!=null && list2!=null){
         if(list1.val<=list2.val){
           point.next=list1;
           list1=list1.next;
          }else{
           point.next = list2;
           list2=list2.next;
         }
          point = point.next;
       }

       if(list1==null){
           point.next=list2;
       }else{
           point.next=list1;
       }
       return mList.next;
   }
}

①首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。

②申明合并链表的头结点和指针节点

③循环比较两个链表的头结点的值,让当前的point节点指向值较小的那个节点,该节点等于其下一个节点,同时point向后移。

④判别循环后,如果有链表没遍历完,直接加在point后面

⑤返回头结点的下一个节点(头结点是新建的节点)

这个思想很简单:就是新建一个头结点,依次比较两个链表的节点的值,用next指针把他们依次串联起来。


添加回复
回到顶部