剑指offer25 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
样例
输入:1->3->5 , 2->4->5
输出:1->2->3->4->5->5
思路:
初始一个结点l_head,然后不断遍历两个列表并比较大小,小的先进入到新链表。
直到两个全部都为空。
return l_head->next;
AcWing-36 C++ code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
if(l1 == NULL){
return l2;
}else if(l2 == NULL){
return l1;
}
ListNode* l_head = new ListNode(-1);
ListNode* l_now = l_head;
while(l1 && l2){
if(l1->val < l2->val){
l_now->next = l1;
l1 = l1->next;
l_now = l_now->next;
l_now->next = NULL;
}else{
l_now->next = l2;
l2 = l2->next;
l_now = l_now->next;
l_now->next = NULL;
}
}
while(l1){
l_now->next = l1;
l1 = l1->next;
l_now = l_now->next;
l_now->next = NULL;
}
while(l2){
l_now->next = l2;
l2 = l2->next;
l_now = l_now->next;
l_now->next = NULL;
}
return l_head->next;
}
};
AcWing-36 python code:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def merge(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1 == None:
return l2
elif l2 == None:
return l1
l_head = ListNode(-1)
l_now = l_head
while l1 and l2:
if l1.val < l2.val:
l_now.next = l1
l1 = l1.next
l_now = l_now.next
l_now.next = None
else:
l_now.next = l2
l2 = l2.next
l_now = l_now.next
l_now.next = None
while l1:
l_now.next = l1
l1 = l1.next
l_now = l_now.next
l_now.next = None
while l2:
l_now.next = l2
l2 = l2.next
l_now = l_now.next
l_now.next = None
return l_head.next