码迷,mamicode.com
首页 > 编程语言 > 详细

[剑指offer] 合并两个排序链表

时间:2016-05-10 12:56:49      阅读:247      评论:0      收藏: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指针把他们依次串联起来。

[剑指offer] 合并两个排序链表

标签:

原文地址:http://blog.csdn.net/amazing7/article/details/51361430

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!