leetcode之合并两个有序链表

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

示例:

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

思路:从两链表第一个结点开始比较结点的值,取较小者作为合并链表的元素,依次进行;后面如果有一个链表为空,则直接把不为空的链表接到合并链表的后面。

方法1.采用非递归方法

/**
 * 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 temp1=l1;
        ListNode temp2=l2;

        ListNode ret=new ListNode(0);

        ListNode ret1=ret;
        while(temp1!=null&&temp2!=null)
        {
            if(temp1.val>temp2.val)
            {
                ret.next=temp2;
                ret=ret.next;
                temp2=temp2.next;
            }else
            {
                ret.next=temp1;
                ret=ret.next;
                temp1=temp1.next;
            }

        }

        if(temp1==null&&temp2!=null)
        {
            ret.next=temp2;
        }

        if(temp2==null&&temp1!=null)
        {
            ret.next=temp1;
        }

        return ret1.next;

    }
}

方法二.采用递归方法(待优化)

/** * 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 temp1=l1;
        ListNode temp2=l2;
        ListNode ret=getResult(temp1,temp2);

        return ret;
    }

    public ListNode getResult(ListNode t1,ListNode t2)
    {

        ListNode t0=new ListNode(0);
         ListNode head=t0;
        if(t1==null)
            return t2;
        if(t2==null)
            return t1;

        if(t1.val>t2.val)
        {
            t0.next=t2;
            t0=t0.next;
            t0.next=getResult(t1,t2.next);
        }else
        {
            t0.next=t1;
            t0=t0.next;
            t0.next=getResult(t1.next,t2);
        }
        return head.next;
    }

}
点赞