- 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) return l2;
// if(!l2) return l1;
// if(l1->val<l2->val){
// l1->next=mergeTwoLists(l1->next,l2);
// return l1;
// }else{
// l2->next=mergeTwoLists(l1,l2->next);
// return l2;
// }
// }
//归并解法
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while(l1 && l2)
{
if(l1->val <l2->val)
{
cur->next = l1;
l1 = l1->next;
}
else{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
cur->next = l1 ? l1 :l2;//处理l1或者l2有剩余的情况
return dummy->next;
}
};
- python
作者:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 and l2:
if l1.val > l2.val: l1, l2 = l2, l1
l1.next = self.mergeTwoLists(l1.next, l2)
return l1 or l2
备注: 在 Python 中,and 和 or 都有提前截至运算的功能。
and:如果 and 前面的表达式已经为 False,那么 and 之后的表达式将被 跳过,返回左表达式结果
or:如果 or 前面的表达式已经为 True,那么 or 之后的表达式将被跳过,直接返回左表达式的结果
例子:[] and 7 等于 []
代码流程:(按行数)
判断 l1 或 l2 中是否有一个节点为空,如果存在,那么我们只需要把不为空的节点接到链表后面即可
对 l1 和 l2 重新赋值,使得 l1 指向比较小的那个节点对象
修改 l1 的 next 属性为递归函数返回值
返回 l1,注意:如果 l1 和 l2 同时为 None,此时递归停止返回 None