剑指offer合并有序链表

这题直接暴力破解的,无非三种情况,

1.第一个链表为空第二个非空

2.第一个不为空第二个为空

3.两个都非空,这种情况随着合并的进行会转化成1,2两种情况的其中一种情况

当然还有一种特殊情况,两个链表都为空,返回空就可以了 

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if((pHead1 == None)&(pHead2 == None)):
            return None
        mergeHead = ListNode(0)
        res = mergeHead
        while((pHead1!=None) & (pHead2!=None)):
            if(pHead1.val < pHead2.val):
                mergeHead.next = pHead1
                mergeHead = mergeHead.next
                pHead1 = pHead1.next
            else:
                mergeHead.next = pHead2
                mergeHead = mergeHead.next
                pHead2 = pHead2.next
        if pHead2:
            mergeHead.next = pHead2
        if pHead1:
            mergeHead.next = pHead1
        return res.next
        

但剑指offer给了一个递归的思路,发现链表的题目用递归都特别简单:

创建一个空的mergeHead,然后选val小的pHead赋值给mergeHead,比如pHead1,那么mergeHead后续的节点就是Merge(pHead1.next,pHead2)返回的头结点;

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if((pHead1 == None)&(pHead2 == None)):
            return None
        if (pHead2 == None):
            return pHead1
        if (pHead1 == None):
            return pHead2
        mergeHead = None
        if(pHead1.val < pHead2.val):
            mergeHead = pHead1
            mergeHead.next = self.Merge(pHead1.next,pHead2)
        else:
            mergeHead = pHead2
            mergeHead.next = self.Merge(pHead1,pHead2.next)
        return mergeHead
        

翻译成java代码。。。

这是暴力破解:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode MergeHead = new ListNode(0);
        ListNode res = MergeHead;
        while((list1!= null)&&(list2!= null)){
            if(list1.val < list2.val){
                MergeHead.next = list1;
                MergeHead = MergeHead.next;
                list1 = list1.next;
            }
            else{
                MergeHead.next = list2;
                MergeHead = MergeHead.next;
                list2  = list2.next;
            }
        }
        if (list1!=null){
            MergeHead.next= list1;
        }
        if(list2 != null){
            MergeHead.next = list2;
        }return res.next;
    }
}

这是递归的

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
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 = this.Merge(list1.next,list2);
        }
        else{
            mergehead = list2;
            mergehead.next = this.Merge(list1,list2.next);
        }return mergehead;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_17641711/article/details/82957343