这题直接暴力破解的,无非三种情况,
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;
}
}