题目:
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
解释:
把两个有序链表合并成一个有序链表。
用一个新的链表来存储下来排好序的链表。
python代码,循环的方法:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
#循环的方法
if not l1:
return l2
if not l2:
return l1
head=ListNode(0)
p=head
while l1 and l2:
if l1.val<=l2.val:
p.next=l1
l1=l1.next
else:
p.next=l2
l2=l2.next
p=p.next
p.next=l1 if l1 else l2
return head.next
递归的方法,速度更快,这种写法好神奇,p的指向一直在变来变去:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1==None:
return l2
if l2==None:
return l1
p=ListNode(0)
if (l1.val<=l2.val):
p=l1
p.next=self.mergeTwoLists(l1.next,l2)
else:
p=l2
p.next=self.mergeTwoLists(l2.next,l1)
return p
其实根本不需要p这个指针,速度居然更快:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1==None:
return l2
if l2==None:
return l1
if (l1.val<=l2.val):
l1.next=self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next=self.mergeTwoLists(l2.next,l1)
return l2
c++代码:
循环:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//循环解法
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
ListNode*head=new ListNode(0);
ListNode*p=head;
while (l1 &&l2)
{
if (l1->val<=l2->val)
{
p->next=l1;
l1=l1->next;
}
else
{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
p->next=l1?l1:l2;
return head->next;
}
};
递归(可是在cpp中,用递归解法更加慢):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1==NULL)
return l2;
if(l2==NULL)
return l1;
if (l1->val<=l2->val)
{
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else
{
l2->next=mergeTwoLists(l2->next,l1);
return l2;
}
}
};
总结:
还是和在88. Merge Sorted Array(python+cpp)中说的一样,如何可以直接使用题目中所给的指针,无需再声明一个指针。