剑指offer题目16:合并两个排序的链表

合并两个排序的链表

http://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337

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

//解法1:新建一个链表用于存储合并后的链表(或者使用ArrayList存储合并后的链表)
//时间、空间复杂度O(m+n)、O(1)   27ms
public ListNode Merge_16(ListNode list1,ListNode list2) {
    ListNode root=new ListNode(0);
    ListNode tmp=root;
    while (list1!=null && list2!=null){
        if(list1.val>=list2.val){
            tmp.next=list2;
            list2=list2.next;
        }
        else{
            tmp.next=list1;
            list1=list1.next;
        }
        tmp=tmp.next;
    }
    if(list1!=null) tmp.next=list1;
    else if(list2!=null) tmp.next=list2;
    return root.next;
}
//解法2:使用递归,先取出最小值,然后接下来的两条链表进行递归
//时间、空间复杂度O(m+n)、O(1)     24ms
public ListNode Merge_16_2(ListNode list1,ListNode list2) {
    if (list1 == null) return list2;
    if (list2 == null) return list1;
    if(list1.val>list2.val) return Merge_16_2(list2,list1);
    list1.next=Merge_16_2(list1.next, list2);
    return list1;
}
//解法3:不开辟空间,在原链表上操作     30ms
public ListNode Merge_16_3(ListNode list1,ListNode list2) {
    if (list1 == null) return list2;
    if (list2 == null) return list1;
    if(list1.val>list2.val) return Merge_16_3(list2,list1);
    ListNode root=list1,tmp;//list1的第一个节点最小
    while (list1.next!=null && list2!=null){
        if(list2.val>=list1.next.val) list1=list1.next;
        else {
            tmp = list1.next;//记录list1的下一个节点tmp(比当前list2节点node大)
            list1.next = list2;//将list2节点插入在list之后
            list2 = list2.next;//list2往后移一位,成为新的list2链表
            list1 = list1.next;//list1往后移一位,指向node节点
            list1.next = tmp;//将node节点的next指针重新指向tmp
        }
    }
    if(list2 !=null) list1.next=list2;
    return root;
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务